我正在尝试整理一个显示模型数据的简单表格。我需要行选择行为,所以我设置:
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
中实现,我也有点混淆了为什么单元格都会获得一个复选框并变为不可选择。有人可以帮忙吗?
干杯, 坦率
答案 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。您还可以在网上找到一些不错的视频教程。