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"为他们所有人回来。也就是说,至少可以说是bad。如果您想创建自己的模型,您至少应该阅读有关模型/视图如何在 Qt 中工作的信息。官方文档有一个很好的部分。您还可以在网络上找到一些不错的视频教程。

于 2012-08-24T09:28:11.213 回答