5

我正在尝试使用 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工作的。我想知道是否有人知道如何授予工作线程直接访问小部件的权限?

4

1 回答 1

6

Qt 中不允许从除主线程之外的任何地方访问任何小部件。所有 UI 操作都需要在主线程中完成(除了少数例外,例如在 QImage 上绘制)。

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

如果你的信号有参数,它们的类型需要用qRegisterMetaType.

于 2013-06-25T16:53:43.247 回答