【问题标题】:Setting Table Items Across Multiple Threads跨多个线程设置表项
【发布时间】:2013-06-22 12:07:03
【问题描述】:

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

【问题讨论】:

  • 有一些关于这个here的讨论。简单来说,它用于让 Qt “知道”用户或某些外部源定义的其他类型。通常,信号和插槽需要它。

标签: c++ multithreading qt user-interface


【解决方案1】:

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

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

如果你的信号有参数,它们的类型需要注册到qRegisterMetaType

【讨论】:

  • 感谢您的帮助。经过一番谷歌搜索后,我意识到我必须从小部件中删除多线程。能否提供一个示例,说明如何使用qRegisterMetaType 注册,比如说,一个结构?
  • 注册一个结构体很简单,参见 qRegisterMetaType 的文档。示例:qRegisterMetaType("MyStruct");
猜你喜欢
  • 2019-07-24
  • 2013-07-28
  • 1970-01-01
  • 2012-01-14
  • 1970-01-01
  • 2012-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多