我正在尝试使用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().)
我不太确定qRegisterMetaType
是如何运作的。我想知道是否有人知道如何授予工作线程直接访问小部件的权力?
答案 0 :(得分:6)
在Qt中不允许从主线程以外的任何东西访问任何小部件。所有UI操作都需要在主线程内完成(除了一些例外,例如在QImage上绘制)。
在您的情况下,当您要添加新项目时,在工作线程中发出信号。在主线程中,有一个实际创建项目的插槽,即调用ui->table->setItem(0,0,new QTableWidgetItem(tr("%1").arg(value)));
。然后简单connect()
信号和插槽一起。 Qt将意识到发送者和接收者生活在不同的线程中并自动使用QueuedConnection
。只要Qt的主线程返回到事件循环,就会调用您的插槽。
如果您的信号有参数,则需要使用qRegisterMetaType
注册其类型。