PyQt:如何设置 QTreeView 的行高 [英] PyQt: How Can I set row heights of QTreeView

查看:267
本文介绍了PyQt:如何设置 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆