在QAbstractItemModel :: data()中,如何添加一些线程安全数据
QAbstractItemModel :: data()是一个'const'函数,因此我无法添加作用域互斥锁,但是必须在某个地方更改数据,因此它必须是互斥锁,如何解决此问题?
ps:我已经尝试了connect / emit,但是信号也需要'const'关键字,所以我需要使用TCP套接字吗?
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const
{
QMutexLocker locker(&cacheMutex_);
auto cacheTime = logCache_.find(key_);
}
答案 0 :(得分:2)
从您的代码片段中,我相信您的意思是添加一些同步对象作为派生类成员。如果是这样,@ Tas的评论已经是答案:同步对象在概念上不被视为数据的一部分,因此只需在派生类中将它们标记为可变即可:
可变QMutex cacheMutex _;
标记为可变的数据成员仍然可以在const成员函数中进行修改。
答案 1 :(得分:0)
详细了解QMetaObject
。并始终在主线程中使用UI。
尝试使用QMetaObject::invokeMethod(..., Qt::BlockingQueuedConnection)
,您的方法将在主线程中执行。
因此,您不需要互斥。谢谢!