1

UIのいくつかの基準に基づいて定期的に変更されたモデル(QAbstractItemModelから派生)を持つQListViewがあります。現在のモデルが更新されたとき、またはモデルが変更されたときに、新しい行が追加/削除されたとビュー自体が認識したときに通知を受け取りたいです。setIndexWidget を呼び出して特定の列の下にカスタム コントロールを追加するには、この通知が必要です。ウィジェットの人口は高価であるため、 setIndexWidget を繰り返し呼び出すことは避けたいと思います。したがって、1 行に 1 回が理想的です。

私は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 に答える