QTableView - 错误的重绘与行选择

时间:2012-08-24 07:02:45

标签: qt pyqt4 pyside

我正在尝试整理一个显示模型数据的简单表格。我需要行选择行为,所以我设置:

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中实现,我也有点混淆了为什么单元格都会获得一个复选框并变为不可选择。有人可以帮忙吗?

干杯, 坦率

1 个答案:

答案 0 :(得分:0)

您正在覆盖QTableView s selectionChanged。这可能(可能)在视图内部使用,你可以防止这种情况发生。我不确定你为什么要那样做。如果您想在选择更改时执行自定义操作,则应使用selectionChanged的{​​{1}}信号作为视图。

但是如果你坚持在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

至于覆盖模型的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。也就是说,至少可以说,。如果你想创建自己的模型,至少应该阅读模型/视图在Qt中的工作方式。官方文档有a nice section。您还可以在网上找到一些不错的视频教程。