正如主题所说,我是从非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) - 一切似乎都没问题。
data
指向的对象存在于GUI线程中,我已经仔细检查了这一点。
如何调试此问题?或者,更好的是,可能完全回避它?
答案 0 :(得分:1)
我所以愚蠢。
我花了很多时间天调试这个。
问题看起来像这样:
bool VideoWidget::event(QEvent* e)
{
if (!impl_)
return false;
// ...
}
是的,我已重新实现QObject::event()
(为show / hide和resize事件添加一些特殊处理),没有调用基本方法。并且,猜猜是什么,Qt::QueuedConnection
使用QEvent
来进行延期调用。
永远不要像我那样做。真。
或者,亲爱的Qt,您可以使用NVI来防范这类错误吗?