获得QAbstractItemView变化通知的最佳方式是什么?

时间:2013-09-20 20:17:19

标签: c++ qt qabstractitemmodel

我有一个QListView,它的模型(派生自QAbstractItemModel)会根据UI中的某些条件定期更改。当视图本身认为在当前模型更新时或模型更改时添加/删除了新行时,我希望收到通知。我需要这个通知,以便我可以调用setIndexWidget并在特定列下添加自定义控件。我不想重复调用setIndexWidget,因为窗口小部件的数量很大。所以每一行都是理想的。

我已经尝试过rowsInserted / rowsAboutToBeRemoved和dataChanged,但是如果设置在视图中的模型中已有项目,则不会调用它们。

任何想法都会非常感激。

1 个答案:

答案 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);

您所描述的内容很可能是由模型的错误行为引起的。您可以使用模型测试套件来验证模型是否符合所需的不变量。

具体解决您的问题点:

  1. 我希望在视图本身认为当前模型更新后添加/删除新行时会收到通知...

    视图不需要相信任何东西。您的模型必须发出相应的信号。只需连接某些QObject的信号即可。这就是所有观点。如果信号未触发,则不会通知视图。故事结束。

  2. ...或更改模型时。

    由于整个模型被替换,因此没有信号。你是那个在视图上调用setModel的人,所以这应该不是问题。你最好知道什么时候打电话:)