2012-01-24 30 views
5

私はQTableViewを使ってPyQtアプリケーションで表示したいカスタムデータ構造を持っています。私はデータと通信するためにQAbstractTableModelのサブクラスを使用しています。データ構造自体は別のモジュールにあり、PyQtについては何も知らない。データソースのソート後にQAbstractTableModelおよびQTableViewを更新するにはどうすればよいですか?

QTableViewでデータを表示および編集することはできますが、データを並べ替えてモデルとビューを更新したいと考えています。

QAbstractTableModelとその祖先QAbstractItemModelのためのQtのドキュメントを読んだ後、私の最初のアプローチは、これを試してみた:

class MyModel(QtCore.QAbstractTableModel): 
    __init__(self, data_structure): 
     super().__init__() 
     self.data_structure = data_structure 

    # ... 

    def sort_function(self): 
     self.layoutAboutToBeChanged.emit() 
     # custom_sort() is built into the data structure 
     self.data_structure.custom_sort() 
     self.layoutChanged.emit() 

しかし、これは、ビューを更新するために失敗しました。私はまた、モデルによって使用されているすべてのデータに対してdataChanged信号を出力しようとしましたが、これもビューの更新に失敗しました。

私はさらなる研究を行った。私が正しく理解していれば、モデルのQPersistentModelIndexesが更新されていないという問題があり、その解決方法は何とか手動で更新することになります。

これを行うより良い方法はありますか?もしそうでなければ、どうすればそれらを更新するのでしょうか(できれば、すべてのインデックス変更を追跡する新しいソート関数を書く必要はありません)。

+0

ここでは、永続的なインデックスについて心配する必要はありません。私はあなたの 'sort_function'と同じシグナルを出し、ビューを正しく更新するモデルを書いています。 'custom_sort()'が実際にデータを変更し、その変更がモデルの 'data()'メソッドに反映されているのでしょうか? –

+0

@FerdinandBeyerああ、それは問題でした!私はすでにデータが変更されていることを確認したが、data()メソッド自体をチェックするとは思わなかった。 custom_sort()は、ソートが必要な場所でいくつかの項目をコピーしていました。どうもありがとうございました! –

+0

問題ありません。あなたの解決策を回答として投稿し、それを受け入れるようにしてください。そうすれば、この質問に答えが記されます! –

答えて

3

custom_sort()関数にバグがありました。それを固定した後、私がここで説明したアプローチが働きます。

class MyModel(QtCore.QAbstractTableModel): 
    __init__(self, data_structure): 
     super().__init__() 
     self.data_structure = data_structure 

    # ... 

    def sort_function(self): 
     self.layoutAboutToBeChanged.emit() 
     # custom_sort() is built into the data structure 
     self.data_structure.custom_sort() 
     self.layoutChanged.emit() 
関連する問題