gpt4 book ai didi

c++ - 确定 QKeyEvent 的来源

转载 作者:太空宇宙 更新时间:2023-11-04 11:04:01 25 4
gpt4 key购买 nike

我有一个 Qt 应用程序,其中有多个小部件同时显示按钮。在某些情况下,我希望将按键发送到其中一个小部件,即使该小部件没有焦点。为此,我在主窗口小部件(拥有此应用程序中的所有子窗口小部件)中重写了 keyPressEvent(),如果它没有焦点,则使用类似的代码将键事件重新发送到子窗口小部件对此:

if (!someWidget->hasFocus())
{
QApplication::sendEvent(someWidget, keyEvent);
}

只要 someWidget 处理上述事件,它就可以很好地工作。如果它忽略它,那么它会进入一个讨厌的无限递归循环,因为事件会向上流动到父级。

有没有办法知道事件的来源,从而防止这种无限循环?我在想这样的事情:

if (!someWidget->hasFocus() && (keyEvent->source != someWidget))
{
QApplication::sendEvent(someWidget, keyEvent);
}

或者是否有其他方法可以防止这种情况发生?

最佳答案

当你使用信号和槽机制时,你可以调用可以给你信息的sender(),但是你可以做下一步:使用可以给你信息的eventFilter关于每个将事件发送到 mainWindowQObject,因此您可以捕获事件和发送者

    bool MainWindow::eventFilter(QObject *obj, QEvent *event)
{
if(event->type() == QEvent::KeyPress)//your keyPressEvent but with eventFilter
if(!someWidget->hasFocus() && obj != someWidget)//your focus and source checkings, obj is object which send some event,
// but eventFilter catch it and you can do something with this info
{
//do something, post event
}

return QObject::eventFilter(obj, event);
}

不要忘记

protected:
bool eventFilter(QObject *obj, QEvent *event);

也许你需要使用QKeyEvent,所以如果你确定event->type() == QEvent::KeyPress 就转换QEvent。例如:

QKeyEvent *key = static_cast<QKeyEvent*>(event);
if(key->key() == Qt::Key_0)
{
//do something
}

关于c++ - 确定 QKeyEvent 的来源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25981262/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com