gpt4 book ai didi

c++ - 跨多个线程设置表项

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:25:13 25 4
gpt4 key购买 nike

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

最佳答案

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

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

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

关于c++ - 跨多个线程设置表项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17301650/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com