如何调整 QTreeView 和 QStandardItemModel 中的行大小?

Posted

技术标签:

【中文标题】如何调整 QTreeView 和 QStandardItemModel 中的行大小?【英文标题】:How to resize rows in a QTreeView and a QStandardItemModel? 【发布时间】:2016-05-25 19:31:57 【问题描述】:

我想将我的行设置为固定高度。我找到了一个使用 QAbstractItemModel 的示例,但我使用的是 QStandardItemModel。当我运行应用程序时,QTreeView 是空白的。关于如何让 QStandardItemModel 工作的任何想法?

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(10, 10)

        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_())

另外,我一直在寻找 Qt 中委托一词的含义,但这个概念还没有在我脑海中浮现。对此的任何见解也将不胜感激!

【问题讨论】:

【参考方案1】:

您通常使用QItemDelegates(或QStyledItemDelegate,如果您希望样式表样式起作用)通过覆盖sizeHint 方法并始终返回固定高度的大小来执行此操作。

class MyDelegate(QtGui.QStyledItemDelegate):

    def sizeHint(self, option, index):
        my_fixed_height = 30
        size = super(MyDelegate, self).sizeHint(option, index)
        size.setHeight(my_fixed_height)
        return size


view = QtGui.QTreeView()
delegate = MyDelegate()
view.setItemDelegate(delegate)

【讨论】:

以上是关于如何调整 QTreeView 和 QStandardItemModel 中的行大小?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 QTreeView 中仅显示模型的一部分?

如何使Qt小部件可调整大小[重复]

覆盖 mousePressEvent 后 Qt Widget 调整大小

如何在 QAbstractItemModel 和 QTreeView 类中找到子项?

如何获取 QTreeView 的大小/深度/分支?

如何将起点目录设置为 QTreeView?