Qt:在孩子面前捕捉事件

时间:2014-05-14 23:35:48

标签: c++ qt events user-interface qt-events

我有stackedWidget,我想捕获他的孩子的所有mouseClickEvents,他们的类型是独立的。它们可以在以后添加和删除(从stackedWidget中删除,不删除)。我怎样才能做到这一点?

2 个答案:

答案 0 :(得分:0)

您可以在所有子窗口小部件上安装事件过滤器,事件过滤器可以是新类或现有类,重要的是它实现eventFilter方法并从QObject继承

一个例子(从纪录片修改)

bool FilterObject::eventFilter(QObject *obj, QEvent *event)
{
    if (obj == textEdit) {
        if (event->type() == QEvent::mousePress) {
            QMouseEvent *mouseEvent = static_cast<QMouseEvent*>(event);
            qDebug() << "Ate mouse press" << mouseEvent->x() << " " << mouseEvent->y();
            return true;
        } else {
            return false;
        }
    } else {
        // pass the event on to the parent class
        return FilterObject::eventFilter(obj, event);
    }
}

在创建窗口小部件后执行以下操作来安装事件过滤器

 FilterObject * filterObj = new FitlerObject(this);

 Q_FOREACH(QObject obj, pWin->children())
 {
     obj->installEventFilter(filterObj);
 }

您可以在http://qt-project.org/doc/qt-4.8/qobject.html#eventFilterhttp://qt-project.org/doc/qt-4.8/qobject.html#installEventFilter

找到完整的doco

答案 1 :(得分:0)

这里有关于如何获取子控件事件的说明:

http://falsinsoft.blogspot.com/2014/04/qt-get-child-controls-events.html

基本上,方法是已建议的事件过滤器。然而问题是&#34;是如何安装过滤器,以防您的窗口GUI通过Qt Designer工具进行管理。在这种情况下,您无法直接控制创建子控件的代码,您需要使用替代方法来获取&#34; ChildAdded&#34;主要对象的事件,用于在每个新的子控件中安装过滤器,刚刚添加,如上面的链接中所述。