Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 跨多个线程设置表项_C++_Multithreading_Qt_User Interface - Fatal编程技术网

C++ 跨多个线程设置表项

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

我正在尝试使用单独的工作线程(使用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 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”);