跨多个线程设置表项

时间:2013-06-25 15:40:14

标签: 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 registered using qRegisterMetaType().)

我不太确定qRegisterMetaType是如何运作的。我想知道是否有人知道如何授予工作线程直接访问小部件的权力?

1 个答案:

答案 0 :(得分:6)

在Qt中不允许从主线程以外的任何东西访问任何小部件。所有UI操作都需要在主线程内完成(除了一些例外,例如在QImage上绘制)。

在您的情况下,当您要添加新项目时,在工作线程中发出信号。在主线程中,有一个实际创建项目的插槽,即调用ui->table->setItem(0,0,new QTableWidgetItem(tr("%1").arg(value)));。然后简单connect()信号和插槽一起。 Qt将意识到发送者和接收者生活在不同的线程中并自动使用QueuedConnection。只要Qt的主线程返回到事件循环,就会调用您的插槽。

如果您的信号有参数,则需要使用qRegisterMetaType注册其类型。