我见过类似的问题,但没有适合我需要的答案。我想要一个不可见的小部件,它位于我的整个应用程序之上(这里没有问题)。我希望这个小部件能够捕获事件,以便我可以打印关于它们的内容、记录它们等等。我目前连接了一个事件过滤器,可以很好地做到这一点。然后我希望它让事件通过小部件后面的任何东西。因此,例如,如果我尝试按下按钮,不可见的小部件应该注意到在该位置发生了按下,然后应该实际按下按钮。这可以通过简单的方式完成,还是我必须编写代码来模拟不可见小部件下的所有事件?
问问题
1080 次
1 回答
4
从您在评论中披露的所有信息中,我建议您按照前面的讨论过滤事件,然后使用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();
}
};
主.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
于 2013-04-18T13:17:15.253 回答