QObject::connect: 无法排队类型为 'QVector<int>' 的参数

15
我在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<int>,但我还有一个信号,在修改QTreeWidgetItem时发出(例如重命名项目),当我想要更改项目的文本时,我需要断开这个信号的连接。如果我注册QVector<int>,我就无法断开这个信号,而且信号会被触发。
2个回答

17

当您注册QVector时,您的调用是否看起来像这样?

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

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

如果我注册QVector,则无法断开此信号并且该信号已发送

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


1
是的,但我不发出QVector类型。我发出字符串类型。threadData->GetMainUI()->EmitUpdateMe(option, message); - John Smith
1
这就是我在ModifyUI插槽中所做的事情: QObject::disconnect(this->filesTreeWidget, SIGNAL(itemChanged(QTreeWidgetItem*,int)), this, SLOT(OnItemChanged_filesTreeWidget(QTreeWidgetItem*,int))); item->setText(0, QString::fromStdString(newFilename)); QObject::connect(this->filesTreeWidget, SIGNAL(itemChanged(QTreeWidgetItem*,int)), this, SLOT(OnItemChanged_filesTreeWidget(QTreeWidgetItem*,int)), Qt::QueuedConnection); - John Smith
1
我很难理解正在发生什么。如果您能提供更多的代码,也许我可以帮忙。目前情况一点也不清晰。您应该可以编辑自己的问题,对吧? - Jacob Robbins
1
它正在工作。信号没有在线程处理程序中发出。谢谢你的帮助! - John Smith
1
好奇怪...我尝试发出一个完全标准的QAbstractItemModel::dataChanged,却收到了这个错误。不知道为什么如果Qt(5.15.2)在内部使用QVector<int>,为什么没有调用qRegisterMetaType - ulatekh
显示剩余3条评论

3
大多数情况下,看起来像这样的错误似乎是混淆了线程导致的,特别是在我的(有限的)经验中,试图使用运行在工作线程上的命令来操作在GUI线程中“保留”的GUI元素,可能会导致此类错误。
我说“保留”,因为很常见的情况是会出现一个投诉/错误/崩溃,显示出类似“QObject: Cannot create children for a parent that is in a different thread.”(即GUI线程)的信息。
解决方案:始终使用信号和槽从非GUI QThread与GUI元素进行通信。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接