2010-05-02 49 views
1

正如主題所說,我從非GUI線程(某些GStreamer線程,準確地說)發佈事件。代碼如下所示:如何在Qt中調試從非GUI線程發佈的丟失事件?

GstBusSyncReply on_bus_message(GstBus* bus, GstMessage* message, gpointer data) 
{ 
    bool ret = QMetaObject::invokeMethod(static_cast<QObject*>(data), "stateChanged", Qt::QueuedConnection); 
    Q_ASSERT(ret); 

    return GST_BUS_PASS; 
} 

的問題是,stateChanged(不要緊,無論它是一個槽或信號)不叫。我用調試器步入QMetaObject::invokeMethod,接着它調用PostMessage(順便說一句,在Windows上是Qt 4.6.2) - 一切似乎都正常。

對象指向data住在GUI線程中,我已經仔細檢查過了。

如何調試此問題?或者,更好,也許完全避開它?

回答

1

0h my god。

我是所以笨。

調試這個我花了字面上天。

而問題是這樣的:

bool VideoWidget::event(QEvent* e) 
{ 
    if (!impl_) 
     return false; 

    // ... 
} 

是的,我已經重新實現QObject::event()(添加爲顯示/隱藏一些特殊的處理和調整大小事件),並且沒有調用基方法。而且,猜猜看,Qt::QueuedConnection使用QEvent s進行延遲呼叫。

千萬別像我這樣做。真。

或者,親愛的Qt,請您用NVI來防範我們這樣的錯誤嗎?