2010-08-03 64 views
1

我正在研究多线程Qt应用程序,并希望将线程中的信号与另一个线程中的插槽连接起来。我的问题是,我只有用于在项目范围常量文件中定义的信号线程中设置QObject:objectName的字符串。正在搜索QObject

我的总体目标是避免必须将指针传递给其他对象内部多层的对象。过去我一直在做这件事,但它在工作时会增加很多不必要的代码复杂性。这是一个非常不雅的解决方案。

我想要做的是通过我的应用程序中的所有QObject进行全局搜索,以找到与名称匹配的那个QObject。在阅读Qt文档时,关于如何搜索当前子对象的相当多讨论,或者您可以使用父类进行搜索。但对于不同线程中的对象,这似乎不起作用。特别是,由于执行连接的对象不能直接访问拥有进行信号传递的对象的QThread。

有什么建议吗?

回答

1

对象树必须属于同一个线程。 QObject的详细说明如下:

使用moveToThread()函数可以更改对象及其子项的线程关联(如果该对象具有父项,则该对象无法移动)。

我看到一个有趣的解决方案,以找到Qt Creator中实现的对象的问题:它的plugin manager has a global object registry,您可以添加和删除对象,后来被类型对它们进行查询。这将很容易扩展它,并允许按名称查询。只记得名字不必是唯一的。

+0

非常有趣的链接。谢谢! – 2010-08-04 00:28:38

1

你可以写你自己的名字=>对象图。 Qt的容器类是线程安全的。

+1

在回顾Qt的文档时,我发现它们都是可重入的,但是,我没有看到文档说容器是线程安全的。就在上个星期,我在一个多线程应用程序中使用QQueue,错过了一个互斥锁。我花了一段时间才弄清楚为什么我有时会有来自QQueue的垃圾数据。所以根据我的经验,我不同意Qt容器是线程安全的。 – 2010-08-04 00:37:10