自定义Qt事件未交付(事件流程:内部窗口小部件 - > QMainWindow)

时间:2014-01-08 13:17:14

标签: c++ qt

我有一个QMainWindow派生的Widget,它包含一个QGLWidget派生的Widget。我有一个自定义事件将从GLWidget的paintGL()方法中被触发(通知应该是异常的,这就是我想发布事件的原因):

QCoreApplication::postEvent(parent(),new ColpickEvent(rgb, pickPoint));

事件看起来像这样(非常简单,没有数据封装):

#define COLORPICK_EVENT QEvent::Type(31337)
class ColpickEvent : public QEvent
{
public:
    ColpickEvent(QRgb col, const QPoint& pos)
        : QEvent(COLORPICK_EVENT), Color(col), PixelPos(pos) {};
    QColor  Color;
    QPoint  PixelPos;
};

MainWindow覆盖QObject :: event(QEvent *),如下所示:

#define EVENT_TYPE(ClassName) { ClassName *e = static_cast<ClassName*>(event)
#define END_EVENT } break
#define ACCEPT_EVENT e->accept(); return true
bool MainWindow::event(QEvent* event)
{
    switch(event->type())
    {
    /*... handle other events ...*/
    case COLORPICK_EVENT:
        EVENT_TYPE(ColpickEvent);
        // do something with the data provided by the event ...
        ACCEPT_EVENT;
        END_EVENT;
    /*... handle other events ...*/
    }
    return QMainWindow::event(event);
}

发生的事情是,我的ColpickEvent似乎永远不会被派遣到MainWindow。任何想法为什么会发生这种情况(或实际上不会发生)?

1 个答案:

答案 0 :(得分:0)

OOPS。

由于顶级窗口小部件是从QMainWindow派生的,因此它需要一个centralWidget。不知何故,将GLWidget设置为centralWidget是不可能的,因为我需要一个Layout来覆盖其上的其他小部件。 所以MainWindow的centralWidget是一个带有GridLayout的简单QWidget“w”。 GLWidget被添加到布局中,其父级已更改为“w”。

因此,解决方案就足够了:

QCoreApplication::postEvent(parent()->parent(),new ColpickEvent(rgb, pickPoint));

(见双亲通话)。