2014-01-08 23 views
0

我有一個包含QGLWidget來繪圖衍生的Widget QMainWindow中衍生的Widget。我將從GLWidget的paintGL中激發一個自定義的事件()方法的方式(該通知應asynchonous,這就是爲什麼我想發佈事件):定製Qt的事件未送達(事件流:小工具裏面 - > QMainWindow中)

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

事件看起來是這樣的(很簡單,沒有數據的capsuling):

#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; 
}; 

的主窗口覆蓋的QObject ::事件(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

你說的沒錯清晰,但我發現我的解決方案太快 - 我不允許我自己8小時添加一個答案。 – St0fF

回答

0

OOPS。

作爲頂層插件從QMainWindow的派生出來,它需要有一個centralWidget。不知何故,將GLWidget設置爲centralWidget是不可能的,因爲我需要一個Layout來覆蓋其他小部件。 因此,MainWindow的centralWidget是一個帶有GridLayout的簡單QWidget「w」。 GLWidget被添加到佈局,這樣它的父項被更改爲「w」。

正因爲如此,解決的方法就是足夠的:

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

(見雙父通話)。