【问题标题】:What is the best way to be notified of changes in an QAbstractItemView通知 QAbstractItemView 更改的最佳方式是什么
【发布时间】:2013-09-20 20:17:18
【问题描述】:

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

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

任何想法将不胜感激。

【问题讨论】:

  • 您确定在填充模型时没有替换它(使用不同的 QAbstractItemModel 对象)导致您与 QListView 的初始连接丢失?
  • setModel 不应该处理所有这些连接吗?
  • 如果您连接到 QListView 的信号,SetModel 将正确处理该问题。我试图找出问题的原因,我认为您直接连接到模型的信号然后更改模型。在这种情况下,除非您在更改模型后更新连接,否则您的信号将不再被发送。

标签: c++ qt qabstractitemmodel


【解决方案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 的人,所以这应该不是问题。你最好知道什么时候打电话:)

【讨论】:

  • 但是我的模型没有改变。如果我只是将静态模型分配给视图,为什么会调用 dataChanged?我的意思是,这就是我想要的行为,但这似乎不是它的工作方式。
  • 你说模型变了。你真的是在交换整个模型吗?
  • 我偶尔会用另一个调用 setModel 的模型交换模型。但是那些设置到视图中的模型有可能在视图中设置和未在视图中设置时更改。它们也有可能根本不会改变。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多