我看到了类似的问题,但没有符合我的需求的答案。我想要一个不可见的小部件,可以覆盖在我的整个应用程序上面(这没问题)。我希望这个小部件可以捕获事件,以便我可以打印相关信息、记录它们或进行其他操作。我目前已经连接了一个事件过滤器,在这方面做得很好。然后,我希望它能让事件通过并传递给小部件后面的任何东西。例如,如果我尝试按下一个按钮,不可见的小部件应该注意到在那个位置发生了按下事件,然后按钮应该实际被按下。这是否可以简单地完成,或者我需要编写代码来模拟不可见小部件下面的所有事件?
我看到了类似的问题,但没有符合我的需求的答案。我想要一个不可见的小部件,可以覆盖在我的整个应用程序上面(这没问题)。我希望这个小部件可以捕获事件,以便我可以打印相关信息、记录它们或进行其他操作。我目前已经连接了一个事件过滤器,在这方面做得很好。然后,我希望它能让事件通过并传递给小部件后面的任何东西。例如,如果我尝试按下一个按钮,不可见的小部件应该注意到在那个位置发生了按下事件,然后按钮应该实际被按下。这是否可以简单地完成,或者我需要编写代码来模拟不可见小部件下面的所有事件?
根据您在评论中提供的所有信息,我建议您按照先前讨论的方式过滤事件,然后使用QCoreApplication :: sendEvent将所需事件转发给不可见小部件。 然后它会相应地传播事件给其子级。
编辑:好的,这里是一个快速示例,包括基于QObject的事件过滤器,如果事件是鼠标事件,则留给小部件处理并输出,如果事件是键盘事件,则进行过滤并不会返回到小部件:
事件过滤器类:
class EventInfo : public QObject {
Q_OBJECT
public:
explicit EventInfo(QObject *parent = 0) : QObject(parent) {}
bool eventFilter(QObject *, QEvent *e) {
if (e->type() == QEvent::MouseButtonRelease){
qDebug() << "click event not filtered";
return false;
}
if (e->type() == QEvent::KeyRelease) {
QKeyEvent *event = static_cast<QKeyEvent *>(e);
if (event) qDebug() << "key" << event->key() << "filtered";
return true;
}
return false;
}
};
class Widget : public QWidget {
Q_OBJECT
public:
Widget(QWidget *parent = 0) : QWidget(parent) {}
protected:
void mouseReleaseEvent(QMouseEvent *e) {
qDebug() << "widget clicked at position" << e->pos();
}
void keyReleaseEvent(QKeyEvent *e) {
qDebug() << "pressed key" << e->key();
}
};
main.cpp:
int main(int argc, char *argv[]) {
QApplication a(argc, argv);
Widget w;
EventInfo info;
w.installEventFilter(&info);
w.show();
return a.exec();
}
测试输出以显示键盘事件被过滤,鼠标按下事件被转发到小部件:
click event not filtered
widget clicked at position QPoint(352,230)
key 70 filtered
click event not filtered
widget clicked at position QPoint(405,163)
key 87 filtered
eventFilter()
返回true
- 这告诉事件循环将事件进一步转发。否则,该事件将被消耗。 - dtech