1

PyQt4.9.1のモデルとビューを操作する方法を理解しようとしていますが、少し問題が発生しました。

重要なコードは次のとおりです。

class TestModel(QtGui.QStandardItemModel):
    def __init__(self,parent=None):
        QtGui.QStandardItemModel.__init__(self,parent)
        self.initData()
        self.headings = ['name','value','']

    def initData(self):
        self.rows = [['name {0}'.format(i), i] for i in range(20)]

    def data(self, index, value, role):
        print ("foo")
        if not index.isValid():
            return 
        if (role == QtCore.Qt.DisplayRole):
            row = index.row()
            col = index.column()
            if  (col == 3):
                return "BUTTON GOES HERE"
        return self.rows[row][col]

    def headerData(self,section,orientation,role):
        if (role == QtCore.Qt.DisplayRole):
            if (orientation == QtCore.Qt.Horizontal):
                 return self.headings[section]

    def rowCount(self,parent):
        return len(self.rows)

    def columnCount(self,parent):
        return 3

class MainWindow(QtGui.QWidget):
    def __init__(self):
        super(MainWindow, self).__init__()
        self.m = TestModel()
        self.initUi()

    def initUi(self):   
        layout = QtGui.QVBoxLayout()
        widget = QtGui.QTableView()
        widget.setModel(self.m)
        layout.addWidget(widget)
        self.setLayout(layout)
        self.show()

アプリケーションのメインウィンドウを起動すると、次のようになります。エラーメッセージは表示されず、テーブルは正しい数の行と列、正しい見出しで描画されますが、テーブルは空です。モデルのdrawメソッドがprintステートメントで始まることに気付くかもしれません。その声明に達することはありません。足りないものはありますか?PyQt4.9.1のチュートリアルがまったく見つかりません。

4

1 に答える 1

1

data()パラメータはありませんがvalue、削除しても問題は解決しません。

index(row, column, parent)を作成する必要があるたびに呼び出される仮想メソッドは、要求されたインデックスに対してaが明示的に作成されていない限りQModelIndex、常に無効なインデックスを返します。インデックスが無効な場合、ビューはおそらくセルを表示しようとしないため、呼び出されることはありません。QStandardItemModelQStandardItemdata()

から継承し続ける場合はQStandardItemModel、有効なインデックスを作成するために再実装する必要がありindex()ますが、を使用する代わりに独自の構造を使用してデータを格納しているため、QStandardItem単純に次から継承できますQtCore.QAbstractTableModel

class TestModel(QtCore.QAbstractTableModel):
    def __init__(self,parent=None):
        super(TestModel, self).__init__(parent)
        self.initData()
        self.headings = ['name','value','']

    def initData(self):
        self.rows = [['name {0}'.format(i), i] for i in range(20)]

    def data(self, index, role):
        if index.parent().isValid():
            return None             
        if (role == QtCore.Qt.DisplayRole):
            row = index.row()
            col = index.column()
            # 3rd column index is 2 not 3
            if  (col == 2):
                return "BUTTON GOES HERE"
            # that return should also be "inside" the role DisplayRole
            return self.rows[row][col]
        return None

    def headerData(self,section,orientation,role):
        if (role == QtCore.Qt.DisplayRole):
            if (orientation == QtCore.Qt.Horizontal):
                return self.headings[section]

また、ツリーモデルを表していない場合は、最上位のアイテム(親のないアイテム)に対してゼロ以外の行/列数のみを返す必要があります。

    def rowCount(self,parent):
        if not parent.isValid():
            return len(self.rows)
        return 0

    def columnCount(self,parent):
        if not parent.isValid():
            return 3
        return 0
于 2012-06-01T23:14:26.240 に答える