我的
以下是一段代码:
QAbstractItemModel
的实现监听一些事件,并在单独的线程中处理更新。
更新处理可能导致模型中的布局和/或数据发生更改。
数据本身的存储由boost::mutex
保护,每个对QAbstractItemModel
接口函数的调用(如果我理解正确,则在GUI线程中执行),以及更新处理函数(在单独的线程中)都会锁定互斥量。
在锁定与数据()/rowCount()/whatever尝试同时获取的相同互斥量时,是否可以发出信号layoutChanged/dataChanged?以下是一段代码:
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;
}
QObject
中,通过信号向实际模型通信数据更改,这些模型将存储数据的轻量级“视图” - 例如,如果你的数据存储长文本,则模型可以包含每个项目的前140个字符,以便在视图中显示。对于访问完整数据(而不是与模型连接的视图,以便不经常发生访问),你可以创建自己的模型API,同步检索数据。 - Dmitry