0

私は最近、アプリケーションの書き直しを開始しました。それをモデル/ビューに移植して、そこにあるクラッジの数を減らそうとしています。

これまでのところ、 から継承した読み取り専用モデルを成功裏に作成することができましたQAbstractTableModel。このモデルは次のようなものです。

class MyModel(QtCore.QAbstractTableModel):
    def __init__(self, data, parent=None):
        super(MyModel, self).__init__(parent)
        self.data = data

data多数のオブジェクトを含むリストです。これらは data() メソッドでアクセスされます。

   def data(self, index, role):

       # much stuff omitted for clarity
       return QtCore.QVariant(self.data[index.column()].id)

定義済みのdata要素を使用する場合、これで問題ありません。しかし、実際にdataはプログラムによって変更されます (特定のシグナルが受信されると拡張されます)。モデルにこれを認識させて、ビューもこれらの変更に反応できるようにするにはどうすればよいですか?

私は読み書きモデルについて読んできましたが、ユーザーが編集および変更することもできますが、私の見解では、編集できないようにしたいと考えています。つまり、モデルは「舞台裏で」変更する必要があります。のみ、ビューはそれに適応します。

この場合の最善のアプローチは何ですか? setData() などを使用して読み書きモデルを実装しますか、それとももっと簡単な解決策がありますか?

4

2 に答える 2

1

私のログビューアプリケーションはQAbstractTableModel、ログ レコードの動的リストを使用します。このリストは、ネットワーク経由でレコードが受信されると動的に増加します。ソース コードをダウンロードしてLogRecordModelQAbstractTableModelサブクラスである をそのまま見ることができますPropertySheetModel。これらは両方とも読み取り専用モデルです。

これは Qt モデル/ビュー API を使用した非常に単純なアプリケーションであるため、その手法を独自のアプリケーションに適応させることができるはずです。

于 2011-05-06T22:10:16.317 に答える
1

実際には、おそらく期待していたよりも少し複雑です。テーブルがいつ拡張または縮小されるかをビューに知らせる必要があります。ビューは、アイテムが変更されたときにローカル ベースでのみアイテムを更新するため、テーブルの形状が変更されたときに通知する必要があります。

したがって、テーブルの形状が変更された場合は、 beginInsertRows()beginRemoveRows() (および列の対応するもの) を使用する必要があります。

詳細については、これこれを参照してください。

setData メソッドは、ユーザーが編集可能なインデックスを変更するたびに呼び出されます。

モデル/ビュー プログラミングを始めるのは少し難しいかもしれませんが、安定性、対話性、スケーラビリティ、および再利用性の点で (正しく行われた場合) 莫大な利益をもたらします。

幸運を!

于 2011-05-06T22:01:49.353 に答える