2017-02-10 9 views
0

これはほんの理論的な質問ですが、私はPyQTが初めてです。モデルがデータをどのように更新するかを示すクラスまたはコード例を特定できません。(Qt経由で実行される場合)モデルビューコントローラ:Qtでプログラミングすると、モデルは自動的にデータを更新しますか?

今、私の理解は、プログラマがメソッドを更新するコードモデルデータで変更が行われたときのデータ。

正しいですか?

更新:私の質問には図面が必要なようです:-) それはデータベースに格納されたデータのようにデータです。私の理解では、この画像のデータは、データベースに格納されたデータモデルをデータベース

enter image description here

+0

カスタムモデル(別名Qtベースモデルのサブクラス)を使用しているのか、Qtに付属している標準モデル(QStandardItemModel'など)を使用しているのかによって、この質問に対する回答が異なります。 –

+0

私が試しているとき私が標準クラスを探していることを意味するクラスを識別します。データを更新するためのコードを記述すると、デフォルトでは標準クラスではそれが行われません。 – MiniMe

答えて

0

内のデータのサブセットであるかに基づいていることをデータは​​のいくつかを以下試していないとPyQtまたはPySideで提供されるサンプルプログラムを見てください。

モデルは、データを格納するオブジェクトです。これは、文字列のリストと同じくらい簡単です。ビューは、データを表示するオブジェクトです。 Qtは、一般的なタイプのデータを保存するためのいくつかの標準モデルと、一般的なタイプのデータを表示するための標準ビューを提供します。単純なケースでは、これらのあらかじめ構築されたコンポーネントを使用することができます。これらのコンポーネントには、モデルにデータを追加または削除したり、モデルの変更に応じてビューを更新するための標準的なメソッドがあります。これらの変更は、信号を使用して、モデルからビューに、またはビューウィジェットまたはコントロールウィジェットからモデルに伝播されます。メソッドとシグナルの標準化された名前付けにより、これらはすべてシームレスに機能します。

ただし、特定のデータストレージまたはデータ表示のニーズは多少異なる場合があります。この場合は、カスタムモデルまたはカスタムビューを実装するか、必要に応じて両方を実装できます。フレームワークによって提供されるクラスの1つをサブクラス化することによって、カスタムモデル(またはビュー)を実装します。これらのサブクラスで特定の名前付きメソッドを実装する必要があります。これは、他のコンポーネントとの自動動作を機能させる標準的な名前付けですが、自分のカスタムメソッドを追加することもできます。

さらにMiniMeのコメントに続きます:

例を見てみましょう。 Qtモデルには、データ項目を更新するxx.setData()メソッドがあります。このメソッドは、モデルのどこにデータが移動するか(インデックス)と新しいデータを指定するパラメータをとります。そのメソッドを実装するときは、使用する基本ストレージメカニズム(リストや辞書など)にデータを更新し、xx.dataChanged()信号を送出する作業を行います。ビューがこのモデルにリンクされている場合は、この信号にサブスクライブしているので自動的に更新されます。

def setData(self, index, value): 
    # Update the data in the underlying python list self.my_list 
    # The index object is of a data type provided by Qt. To perform 
    # this operation we have to extract the row number where the change 
    # is to be made, then use that to update the appropriate entry in 
    # the list. 
    self.my_list[index.row()] = value 

    # Create a PyQt modelIndex object based on the row number that was 
    # updated. The self.index() method is provided by Qt. 
    modelIndex = self.index(index.row()) 

    # Send the modelIndex of the change to any connected views so they 
    # know to update themselves 
    self.dataChanged.emit(modelIndex) 

    # In reality we'd do some validation checks and return False if there 
    # was a problem and the data change didn't happen. 
    return True 

新しいデータ項目をリストに追加するか、リストからデータ項目を削除するには、同様の方法を実装する必要があります。これらのメソッドは変更を行い、モデルのどの部分が変更されたかを示す信号を添付ビューに送信してからリターンします。私はこれがもっと役立つことを願っています。

+0

サイモンに感謝しますが、あなたの答えは私が知っていたことを説明しています。モデルデータが変更されたときにQtがデータを更新する手段を持っているのか、私自身のモデルを書く必要があるのか​​を理解する必要があります。上で説明しているのは、理解する必要のないモデルとビューを作成する方法です。 – MiniMe

+0

私の質問を画像で更新しました。私はまだあなたの答えは私の質問に対処していないと信じています – MiniMe

+0

さて、私は理解していると思います。私はあなたが外部データストアについて言及しなかったので、あなたがビューでそれを更新することを意味する「データを更新する」と言ったと仮定しました。はい、モデルコード内の基になるデータベースを更新します。私の例では、これはself.my_listの要素を変更する行です。代わりに、更新プログラムをバックエンドデータベースに書き込むことになります。 –

関連する問題