我有一个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。任何想法为什么会发生这种情况(或实际上不会发生)?
答案 0 :(得分:0)
OOPS。
由于顶级窗口小部件是从QMainWindow派生的,因此它需要一个centralWidget。不知何故,将GLWidget设置为centralWidget是不可能的,因为我需要一个Layout来覆盖其上的其他小部件。 所以MainWindow的centralWidget是一个带有GridLayout的简单QWidget“w”。 GLWidget被添加到布局中,其父级已更改为“w”。
因此,解决方案就足够了:
QCoreApplication::postEvent(parent()->parent(),new ColpickEvent(rgb, pickPoint));
(见双亲通话)。