11

我对 Qt 有一些问题。我有一个带有信号的类,其参数是字符串和一个插槽。我将信号连接到类构造函数中的插槽。另外,我正在类构造函数中创建一个线程。线程从服务器读取数据并更新 UI(发出 UpdateMe 信号)。这就是我将信号连接到插槽的方式:

             QObject::connect(this, SIGNAL(UpdateMe(string, string)), this, SLOT(ModifyUI(string, string))); 

我有一个带有一些文件名的 QTreeWidget。当我重命名文件时,我通知服务器,服务器通知其他客户端。当我连接单个客户端时没有问题,但是当我连接多个客户端时出现问题:当我从第二个客户端通知服务器时(当我写入套接字时)出现以下错误:

             QObject::connect: Cannot queue arguments of type 'QVector<int>'

我尝试使用 qRegisterMetaType 注册 QVector,但是当我修改 QTreeWidgetItem(例如,当我重命名项目时)时也会发出一个信号,并且当我想更改项目的文本时需要断开此信号。如果我注册 QVector,我无法断开此信号并发出信号。

4

2 回答 2

15

当你注册 QVector 时,你的调用是这样的吗?

qRegisterMetaType<QVector<int> >("QVector<int>");

进行此调用后,您应该能够通过排队连接发出 QVector 类型。

如果我注册 QVector,我无法断开此信号并发出信号。

注册元类型不应阻止您断开信号。它只允许您对尚未在元系统中注册的类型进行排队。

于 2013-01-26T21:39:03.910 回答
1

大多数时候,看起来像这样的错误似乎是混合线程的结果,特别是对于这个错误,在我的(有限)经验中,尝试使用命令操作 GUI 线程中“持有”的 GUI 元素的结果运行一个工人QThread

我说“保留”是因为您经常会收到投诉/错误/崩溃,例如“QObject:无法为处于不同线程中的父级创建子级”。(即 GUI 线程)。

解决方案:从非 GUIQThread始终使用信号和插槽与 GUI 元素通信。

于 2021-08-29T16:42:55.067 回答