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



我有关注星座:

带有MainWindow

的QT GUI线程

另一个本质上是 CameraManager的线程...每次添加/删除相机时,MainWindow都会被告知。

大致看起来像这样:

MainWindow源自ICameraAddedConsumer

MainWindow实现ConsumeCameraAdded并在此功能中创建小部件。它订阅了ITSELV作为CameraManager

的消费者

添加新相机时,摄像头拨打所有消费者的ConsumeCameraAddedMainWindow)。

问题在于,摄影师生活在另一个线程中,QT显然会抱怨这一点,因为一个小部件不是与MainWindow相同的线程创建的。

有什么建议我如何解决?

根据注释,使用不同线程中的qobjects之间的信号/插槽应处理"自动化"的问题。

否则,假设MainWindow/ICameraAddedConsumerQObject,一个想法可能是使用以下内容:

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

其中consumerMainWindow/ICameraAddedConsumer实例的指针。

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

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

最新更新