首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >传递QModelIndex交叉线程队列连接

传递QModelIndex交叉线程队列连接
EN

Stack Overflow用户
提问于 2011-07-11 19:32:48
回答 2查看 1.5K关注 0票数 2
代码语言:javascript
复制
WMIQuery::wmiquery(WMI::WMITable* table, const QString& query, WMI::ProgressIndicator* progressIndicator)

这是函数签名。我通过QtConcurrent::run打电话给它

代码语言:javascript
复制
QFuture<quint32> future = QtConcurrent::run(WMI::WMIQuery::wmiquery, _table, query);

这个建筑很简单。查询返回的预期行数是已知的。查询是并行运行的,在每个记录上,获取一个行被添加到table: WMI::WMITable*中,WMI::WMITable是一个简单的QObject表数据结构。它在行添加时发出rowsAboutToBeInserted(QModelIndex, int, int)rowsInserted(QModelIndex, int, int)

另一方面,ProgressIndicator在主线程上实例化,table被传递给它的ctor。它通过WMI::WMIQuery::wmiquery()通过ProgressIndicator::setRecordCount(quint64 count)获取预期的行总数。它有一个插槽rowAdded(),它通过做一些简单的数学来释放出100的进度。在它的中心,它连接

代码语言:javascript
复制
connect(_table, SIGNAL(rowsInserted(QModelIndex,int,int)), this, SLOT(rowAdded()));

我所想的。由于WMI::WMIQuery::wmiquery() i运行在不同的线程上(在QThreadPool上),这个连接是一个跨线程排队连接。我说得对吗?

我在运行时收到以下错误

QObject::connect:无法对类型为“QModelIndex”的参数进行排队

(确保“QModelIndex”是使用qRegisterMetaType()注册的。)

我该怎么办?由于我的SLOT(rowAdded())不需要SIGNAL(rowsInserted(QModelIndex,int,int))的3个参数,所以我是否应该像rowInserted()那样发出另一个信号,并且每当我发射rowsInserted(QModelIndex,int,int)时发出它,并且使用这个SIGNAL代替这个连接

您可能会问,为什么我在表数据结构中使用像rowsInserted(QModelIndex,int,int)这样的模型信号。因为我也有一个连接到这个表的模型。也将逐行更新。不过,在这方面,我认为这是非常重要的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-07-11 19:53:47

在通过具有非平凡参数类型(如QModelIndex)的线程边界发出信号之前,必须先调用以下命令:

qRegisterMetaType("QModelIndex");

这使得Qt能够跨线程边界发出信号。

通常,您会在main()或只运行一次的地方执行此操作,调用emit之前执行,但是之后QApplication已经被实例化。

这仅对非平凡的类型是必要的。例如,这样的信号将而不是要求您调用qRegisterMetaType()

信号: mySignal(int,int );

但是像这个这样的信号需要qRegisterMetaType()

信号:空洞mySignal(QModelIndex);

有关更多信息,请参见这里的Qt文档:http://doc.qt.nokia.com/latest/qmetatype.html#qRegisterMetaType

票数 2
EN

Stack Overflow用户

发布于 2016-06-24 22:03:23

我知道这已经很晚了,但我想确定有人提到了: QModelIndex不是用来排队的,因为它不打算在以后以其他方式存储和使用。也就是说,如果模型在使用QModelIndex之前发生了变化,您将得到未定义的行为。如果需要具有模型索引的排队事件,则应该使用QPersistentModelIndex。与最初的问题不太相关,但可能对来到这里的人有用。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6655420

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档