PyQt:如何设置 QTreeView 的行高 [英] PyQt: How Can I set row heights of QTreeView
问题描述
在 PyQt 中,我正在寻找一种在 QTreeView
中设置行高的方法(类似于 QTableView.setRowHeight(row, row_height)
,但是 QTreeView
没有这个功能).QAbstractItemModel
用于设置树模型.我在这里阅读了一些建议 使用和子分类 QAbstractItemDelegate.sizeHint(option, index)
但我不知道如何在我的树模型中正确调用它们.
In PyQt, I am looking for a way to set the height of rows in a QTreeView
(similarly to QTableView.setRowHeight(row, row_height)
, but QTreeView
does not have this function). QAbstractItemModel
is used to set the tree model. I read some suggestions here using and sub-classing QAbstractItemDelegate.sizeHint(option, index)
but I don't know exactly how to call them correctly within my tree model.
任何最小的代码或建议将不胜感激.谢谢.
Any minimal code or suggestion would be greatly appreciated. Thanks.
推荐答案
QTreeView
根据为每个项目返回的数据和大小提示计算每行的高度.我认为您可能只需要为所有项目或至少第一行返回大小提示(如果您有 setUniformRowHeights(True)
).顺便说一句,这可以显着提高性能,因此您应该尽可能设置它.
The QTreeView
works out a height for each row based on the data and size hints returned for each item. I think you probably just need to return size hints, either for all your items, or at least the first row (if you have setUniformRowHeights(True)
). Incidentally this can significantly improve performance and so you should set it if you can.
因此,您只需要实现您的 AbstractItemModel.data()
方法以在 SizeHintRole
中返回大小提示.像这样:
So you just need to implement your AbstractItemModel.data()
method to return a size hint in the SizeHintRole
. Something like this:
def data(self, index, role = QtCore.Qt.DisplayRole):
# Check the index, possibly return None
if role == QtCore.Qt.DisplayRole:
# Return the data
elif role == QtCore.Qt.SizeHintRole:
return QtCore.QSize(item_width,item_height)
# Other roles - maybe return None if you don't use them.
大例子
您说您仍然遇到问题,所以这里是一个完整的工作示例,基于标准 QT itemviews 示例.尝试改变 data 方法中返回的 QSize 以查看视图如何变化:
You say you are still having trouble so here is a complete working example, based on the standard QT itemviews example. Try varying the QSize returned in the data method to see how the view changes:
import sys
from PySide import QtCore,QtGui
class TreeItem(object):
def __init__(self, data, parent=None):
self.parentItem = parent
self.data = data
self.childItems = []
def appendChild(self, item):
self.childItems.append(item)
def row(self):
if self.parentItem:
return self.parentItem.childItems.index(self)
return 0
class TreeModel(QtCore.QAbstractItemModel):
def __init__(self, parent=None):
super(TreeModel, self).__init__(parent)
self.rootItem = TreeItem(None)
for i,c in enumerate("abcdefg"):
child = TreeItem([i,c],self.rootItem)
self.rootItem.appendChild(child)
parent = self.rootItem.childItems[1]
child = TreeItem(["down","down"],parent)
parent.appendChild(child)
def columnCount(self, parent):
return 2
def data(self, index, role):
if not index.isValid():
return None
if role == QtCore.Qt.DisplayRole:
item = index.internalPointer()
return item.data[index.column()]
elif role == QtCore.Qt.SizeHintRole:
print "giving size hint"
return QtCore.QSize(40,40)
return None
def flags(self, index):
if not index.isValid():
return QtCore.Qt.NoItemFlags
return QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsSelectable
def headerData(self, section, orientation, role):
if orientation == QtCore.Qt.Horizontal and role == QtCore.Qt.DisplayRole:
return ["A","B"][section]
return None
def index(self, row, column, parent):
if not self.hasIndex(row, column, parent):
return QtCore.QModelIndex()
if not parent.isValid():
parentItem = self.rootItem
else:
parentItem = parent.internalPointer()
childItem = parentItem.childItems[row]
if childItem:
return self.createIndex(row, column, childItem)
else:
return QtCore.QModelIndex()
def parent(self, index):
if not index.isValid():
return QtCore.QModelIndex()
parentItem = index.internalPointer().parentItem
if parentItem == self.rootItem:
return QtCore.QModelIndex()
return self.createIndex(parentItem.row(), 0, parentItem)
def rowCount(self, parent):
if parent.column() > 0:
return 0
if not parent.isValid():
parentItem = self.rootItem
else:
parentItem = parent.internalPointer()
return len(parentItem.childItems)
if __name__ == '__main__':
app = QtGui.QApplication(sys.argv)
model = TreeModel()
view = QtGui.QTreeView()
view.setModel(model)
view.setWindowTitle("Simple Tree Model")
view.show()
sys.exit(app.exec_())
这篇关于PyQt:如何设置 QTreeView 的行高的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!