来自非GUI线程的QStandardItemModel *没有发出itemChanged信号

时间:2016-07-05 08:41:19

标签: multithreading qt signals-slots qstandarditemmodel qtconcurrent

我已经使用QtCuncurrent :: run在非GUI线程中启动了数据库加载。 在这个nonGui线程中,我必须创建QStandardItemModel *然后我在GUI线程中接收模型

model = modelWatcher.result();

在QFutureWatcher finished()信号上。它运行良好(UI已成功构建),但itemChanged()信号不会在项目数据更改时发出(复选框状态已更改)。当我在GUI线程中创建模型时,没有冲突。连接工作没有断言失败:

bool ok = connect(model, SIGNAL(itemChanged(QStandardItem*)), this, SLOT(onFolderStateChanged(QStandardItem*)), static_cast<Qt::ConnectionType>(Qt::UniqueConnection));
Q_ASSERT(ok);

正如我在that thread中看到的(没有代码示例,我误解了主要想法)我无法在nonGui线程中创建模型(Qt5Gui的一部分)。但它对我有用! Ui已经建成)我还必须声明已发送类型:

qRegisterMetaType<QStandardItemModel*>("QStandardItemModel*");

我的另一个发送如下:

qRegisterMetaType<QList<QTreeWidgetItem*> >("QList<QTreeWidgetItem*>");

效果很好(虽然它也是Qt5Gui部分)。

我不想t understand how can I **get the model from nonGui thread with full functionality** like itemChanged signals? Itemit mysignal(QStandardItemModel*);这样的人? 在这种情况下,为什么其他任务在没有任何放射的情况下正常工作?包括currentChanged信号等

2 个答案:

答案 0 :(得分:1)

当我从nonGui线程发送模型时,一些信号已经丢失,因为如果我没有弄错,模型指针和相关数据是不正确的。此外,QStandardItemModel - 是Qt5Gui的一部分,它不是线程安全的。这意味着,该模型和视图应该在GUI线程中收集,并且数据必须从工作线程发送并绑定到GUI线程中的模型。在我的情况下它并不简单 - 我有一棵大树,我不想创建自己的结构来解析树 - 但它是一种真正的方式&#34;)。 我使用更简单的决定 - 我只是将父项指针发送到GUI线程中的新模型 - 它可以工作。 如果有人知道如何从工作线程简单发送树结构 - 请在此主题中告诉它) 在任何情况下 - 在线程之间使用文本表示的数据传输 - 它更优选的方法(如JSON / XML ...任何自己的表示,基于项目的索引,列在``QList&gt;`等...)

答案 1 :(得分:0)

你试过这个吗?

bool ok = connect(model, SIGNAL(itemChanged(QStandardItem*)), this,
SLOT(onFolderStateChanged(QStandardItem*)),
static_cast<Qt::ConnectionType>(Qt::AutoConnection | Qt::UniqueConnection));