我的实施QAbstractItemModel
正在监听一些事件,并在单独的线程中处理更新。
更新的处理可能会导致模型中的布局和/或数据更改。
数据本身的存储方式是boost::mutex
- 受到保护,每次通话QAbstractItemModel
的接口函数(如果我理解正确的话,在 GUI 线程中执行)和更新处理函数(在单独的线程中)锁定互斥体。
是否可以发出信号layoutChanged/dataChanged,同时锁定 data()/rowCount()/任何可能试图同时获取的相同互斥体?
一段代码:
class MyItemModel : public QAbstractItemModel {
Q_OBJECT
public:
void processUpdate(const Update& update) {
Mservice.post([this, update]() {
boost::lock_guard<boost::mutex> lock (Mlock);
bool willModifyLayout = checkWillModifyLayout(update)
bool willModifyData = checkWillModifyData(update);
if (willModifyLayout) {
emit layoutAboutToBeChanged();
}
Mdata.processUpdate(update);
if (willModifyLayout) {
emit layoutChanged();
}
else if (willModifyData) {
emit dataChanged();
}
});
}
virtual QVariant data(const QModelIndex &index, int role) const Q_DECL_OVERRIDE {
boost::lock_guard<boost::mutex> lock (Mlock);
if (index.isValid()) return Mdata.data(index, role);
}
private:
boost::mutex Mmutex;
boost::asio::service Mservice;
boost::asio::thread MserviceThread;
DataStorage Mdata;
}
找到了我自己的问题的答案:
如果模型属于不同的QThread,那么该模型的信号将使用Qt::QueuedConnection连接到视图,这样就可以了。
但是如果(默认情况下)模型属于 GUI QThread(又名 QCoreApplication::instance()->thread()),模型的槽将立即执行,导致调用 data()、columnCount() 等,因此,这不行。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)