C++ 跨多个线程设置表项
我正在尝试使用单独的工作线程(使用POSIX线程)更新表中的值 工作线程正在执行的函数正在尝试执行以下操作:C++ 跨多个线程设置表项,c++,multithreading,qt,user-interface,C++,Multithreading,Qt,User Interface,我正在尝试使用单独的工作线程(使用POSIX线程)更新表中的值 工作线程正在执行的函数正在尝试执行以下操作: ui->table->setItem(0,0,new QTableWidgetItem(tr("%1").arg(value))); 但是,在运行时,我得到以下错误: QObject::connect: Cannot queue arguments of type 'QVector<int>' (Make sure 'QVector<int>' is
ui->table->setItem(0,0,new QTableWidgetItem(tr("%1").arg(value)));
但是,在运行时,我得到以下错误:
QObject::connect: Cannot queue arguments of type 'QVector<int>'
(Make sure 'QVector<int>' is registered using qRegisterMetaType().)
QObject::connect:无法对类型为“QVector”的参数排队
(确保使用qRegisterMetaType()注册了“QVector”。)
我不太清楚
qRegisterMetaType
是如何工作的。我想知道是否有人知道我如何授予工作线程直接访问小部件的权限?在Qt中,除了主线程之外,不允许从任何地方访问任何小部件。所有UI操作都需要在主线程内完成(只有少数例外,例如在QImage上绘制)
在您的情况下,当您想要添加新项目时,在工作线程中发出一个信号。在主线程中,有一个实际创建项的槽,即调用ui->table->setItem(0,0,新的QTableWidgetItem(tr(“%1”).arg(value))代码>。然后简单地将信号和插槽连接在一起。Qt将认识到发送方和接收方生活在不同的线程中,并自动使用QueuedConnection
。每当Qt的主线程返回到事件循环时,就会调用您的slot
如果您的信号有参数,那么它们的类型需要注册到qRegisterMetaType
关于这一点有一些讨论。简单来说,它用于让Qt“知道”用户或某些外部源定义的其他类型。信号和插槽通常需要它。感谢您的帮助。在谷歌搜索了一段时间后,我意识到我必须从小部件中删除多线程。可以提供一个示例,说明如何使用qRegisterMetaType
注册结构?注册结构很容易,请参阅qRegisterMetaType的文档。示例:qRegisterMetaType(“MyStruct”);