我有以下星座:
带有MainWindow
的qt gui线程
基本上是CameraManager
的另一个线程...每次添加/删除摄像机MainWindow
时都会得到通知。
大致如下:
主窗口源自ICameraAddedConsumer
MainWindow
实现ConsumeCameraAdded
并在此函数内创建小部件。它将其elv作为消费者订阅CameraManager
添加新相机后,CameraManager会调用其所有使用者(ConsumeCameraAdded
中的MainWindow
。
问题是CameraManager驻留在不同的线程中,并且Qt显然会抱怨这一点,因为未在与主窗口相同的线程中创建窗口小部件。
有什么建议可以解决这个问题吗?
答案 0 :(得分:0)
根据注释,在不同线程中的QObject之间使用信号/插槽应“自动”解决该问题。
除非这样,并且假设MainWindow/ICameraAddedConsumer
是QObject
,一个想法可能是使用类似这样的东西:
QMetaObject::invokeMethod(consumer, "ConsumeCameraAdded", Qt::QueuedConnection, ...)
其中consumer
是指向MainWindow/ICameraAddedConsumer
实例的指针。
有QWaitCondition
,但我不确定在这种情况下是否有意义(尽管我想可以改编)。
否则...不要在ConsumeCameraAdded()
中创建窗口小部件,而是在其中设置一些标志(并返回),然后使用QTimer
或QObject::timerEvent()
来定期检查标志并创建小部件(如果已设置)。不幸的是,由于线程问题,我很确定您将无法在ConsumeCameraAdded()
内创建或启动计时器。