1

正如主题所说,我正在从非 GUI 线程(确切地说是一些 GStreamer 线程)发布事件。代码如下所示:

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)——一切似乎都很好。

生活在 GUI 线程中的对象data,我已经仔细检查了这一点。

我该如何调试这个问题?或者,更好的是,也许完全避开它?

4

1 回答 1

1

0h我的上帝。

傻了。

我已经花了几天的时间来调试这个。

问题看起来像这样:

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

    // ...
}

是的,我已经重新实现QObject::event()(为显示/隐藏和调整大小事件添加一些特殊处理),并且没有调用基本方法。而且,你猜怎么着,Qt::QueuedConnection使用QEvents 进行延迟调用。

永远不要像我那样做事。真的。

或者,亲爱的 Qt,您能否使用NVI来保护我们免受此类错误的影响?

于 2010-05-03T13:31:26.370 回答