0

モデルのデータを示す単純なテーブルをまとめようとしています。行選択動作が必要なので、次を設定します。

self.setSelectionBehavior(QAbstractItemView.SelectRows)

selectionChanged()行が選択されるたびに再描画が少し混乱するように実装するまでは、すべて問題ありません(セルの選択状態が更新されないようです)。これは私にとって問題を引き起こすいくつかのテストコードです:

import sys
from PySide.QtGui import *
from PySide.QtCore import *

class Item( QStandardItem ):
    def __init__( self, parent=None ):
        super( Item, self).__init__( parent )
        self.pixmap = QPixmap("colour.png")

    #def data(self, role=Qt.UserRole + 1):
        #'''with this method in place the cells get a checkbox and are not selectable'''
        #return 'test'


class Model (QStandardItemModel):
    def __init__( self, parent=None ):
        super( Model, self).__init__( parent )
        self.setHorizontalHeaderLabels(['a', 'b', 'c'])
        self.init_data()

    def init_data(self):
        for row in range(0, 15):
            for col in range(0, 10):
                col_item = Item( '%s, %s' % (row, col) )
                self.setItem(row, col, col_item)

class TableView( QTableView ):
    def __init__( self, parent=None ):
        super( TableView, self).__init__( parent )
        model = Model()
        self.setModel(model)
        self.setSelectionBehavior(QAbstractItemView.SelectRows)
        self.setSelectionMode(QAbstractItemView.ContiguousSelection)
        self.setMouseTracking(True)

    def selectionChanged(self, selected, deselected):
        print selected

if __name__ == '__main__':

    app = QApplication([])
    table = TableView()
    table.show()
    sys.exit(app.exec_())

また、data()メソッドがQStandardItem. 誰か助けてくれませんか?

乾杯、フランク

4

1 に答える 1

0

QTableViewsをオーバーライドしていますselectionChanged。それは(おそらく)ビューによって内部的に使用されており、それを防ぎます。なぜあなたがそれをしたいのかわかりません。選択が変更されたときにカスタム処理を行いたい場合は、ビューにのselectionChangedシグナルを使用する必要があります。selectionModel()

selectionChangedただし、TableView少なくとも親関数を呼び出すことを主張する場合は、そのビューでその作業を行うことができます。

class TableView( QTableView ):
    def __init__( self, parent=None ):
        super( TableView, self).__init__( parent )
        model = Model()
        self.setModel(model)
        self.setSelectionBehavior(QAbstractItemView.SelectRows)
        self.setSelectionMode(QAbstractItemView.ContiguousSelection)
        self.setMouseTracking(True)

    def selectionChanged(self, selected, deselected):
        print selected
        super(TableView, self).selectionChanged(selected, deselected)

ただしQTableView、いくつかのプロパティを設定するためだけにa をサブクラス化する必要はありません。インスタンスに対してそれを行うことができます。実際、すべてのサブクラスは不要です。そのコードは次のように記述できます。

import sys
from PySide.QtGui import *
from PySide.QtCore import *

if __name__ == '__main__':
    app = QApplication([])

    # create model
    model = QStandardItemModel()
    model.setHorizontalHeaderLabels(['a', 'b', 'c'])

    # fill data
    for row in range(15):
        model.appendRow([QStandardItem('%d, %d' % (row, col)) for col in range(10)])

    # create table view
    table = QTableView()

    # set parameters
    table.setModel(model)
    table.setSelectionBehavior(QAbstractItemView.SelectRows)
    table.setSelectionMode(QAbstractItemView.ContiguousSelection)
    table.setMouseTracking(True)

    # show
    table.show()

    sys.exit(app.exec_())

dataモデルのメソッドのオーバーライドに関しては、メソッドは、そのビューが要求する内容dataに応じて、さまざまな値を返す責任があります。roleあなたはいつもそれらすべてのために戻ってき"test"ます。つまり、控えめに言っても悪い。独自のモデルを作成する場合は、少なくともモデル/ビューが Qt でどのように機能するかを読む必要があります。公式ドキュメントには、それについての素晴らしいセクションがあります。また、Web で適切なビデオ チュートリアルを見つけることもできます。

于 2012-08-24T09:28:11.213 に答える