多线程,如何正确创建qt小部件

时间:2019-03-04 09:16:36

标签: c++ multithreading qt

我有以下星座:

带有MainWindow的qt gui线程

基本上是CameraManager的另一个线程...每次添加/删除摄像机MainWindow时都会得到通知。

大致如下:

主窗口源自ICameraAddedConsumer

MainWindow实现ConsumeCameraAdded并在此函数内创建小部件。它将其elv作为消费者订阅CameraManager

添加新相机后,CameraManager会调用其所有使用者(ConsumeCameraAdded中的MainWindow

问题是CameraManager驻留在不同的线程中,并且Qt显然会抱怨这一点,因为未在与主窗口相同的线程中创建窗口小部件。

有什么建议可以解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

根据注释,在不同线程中的QObject之间使用信号/插槽应“自动”解决该问题。

除非这样,并且假设MainWindow/ICameraAddedConsumerQObject,一个想法可能是使用类似这样的东西:

QMetaObject::invokeMethod(consumer, "ConsumeCameraAdded", Qt::QueuedConnection, ...)

其中consumer是指向MainWindow/ICameraAddedConsumer实例的指针。

QWaitCondition,但我不确定在这种情况下是否有意义(尽管我想可以改编)。

否则...不要在ConsumeCameraAdded()中创建窗口小部件,而是在其中设置一些标志(并返回),然后使用QTimerQObject::timerEvent()来定期检查标志并创建小部件(如果已设置)。不幸的是,由于线程问题,我很确定您将无法在ConsumeCameraAdded()内创建或启动计时器。