我有一个QListView,它的模型(派生自QAbstractItemModel)会根据UI中的某些条件定期更改。当视图本身认为在当前模型更新时或模型更改时添加/删除了新行时,我希望收到通知。我需要这个通知,以便我可以调用setIndexWidget并在特定列下添加自定义控件。我不想重复调用setIndexWidget,因为窗口小部件的数量很大。所以每一行都是理想的。
我已经尝试过rowsInserted / rowsAboutToBeRemoved和dataChanged,但是如果设置在视图中的模型中已有项目,则不会调用它们。
任何想法都会非常感激。
答案 0 :(得分:1)
你对dataChanged
错了。如果任何数据项的内容发生变化,则会发出dataChanged
信号。假设dataChanged
槽连接到模型上的相同信号,则以下不变量成立。
class ... : public QObject {
QModelIndex m_index;
bool m_changed;
Q_SLOT void dataChanged(const QModelIndex & tl) {
m_changed = m_changed || tl == m_index;
}
...
};
m_index = QModelIndex(...);
QVariant before, after;
m_changed = false;
before = model->data(index);
after = model->data(index);
Q_ASSERT(before == after || m_changed);
您所描述的内容很可能是由模型的错误行为引起的。您可以使用模型测试套件来验证模型是否符合所需的不变量。
具体解决您的问题点:
我希望在视图本身认为当前模型更新后添加/删除新行时会收到通知...
视图不需要相信任何东西。您的模型必须发出相应的信号。只需连接某些QObject
的信号即可。这就是所有观点。如果信号未触发,则不会通知视图。故事结束。
...或更改模型时。
由于整个模型被替换,因此没有信号。你是那个在视图上调用setModel
的人,所以这应该不是问题。你最好知道什么时候打电话:)