1

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

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

任何想法将不胜感激。

4

1 回答 1

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视图的人,所以这不应该是一个问题。你最好知道什么时候打电话:)

于 2013-09-21T00:30:59.087 回答