跨多个线程设置表项

sj7*_*755 5 c++ user-interface qt multithreading

我正在尝试使用POSIX线程使用单独的工作线程更新表中的值.

工作线程正在执行的功能是尝试执行以下操作:

ui->table->setItem(0,0,new QTableWidgetItem(tr("%1").arg(value)));
Run Code Online (Sandbox Code Playgroud)

但是,在运行时我收到以下错误:

QObject::connect: Cannot queue arguments of type 'QVector<int>'
(Make sure 'QVector<int>' is registered using qRegisterMetaType().)
Run Code Online (Sandbox Code Playgroud)

我不太确定这是怎么回事qRegisterMetaType.我想知道是否有人知道如何授予工作线程直接访问小部件的权限?

Tho*_*ire 6

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

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

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