如何设置QTreeView的列宽?

18 投票
2 回答
29786 浏览
提问于 2025-04-17 07:35

请耐心点,我对QT还很陌生,正在努力理解它的工作方式。

我创建了一个QTreeView,并且里面有两列:

class AppForm(QMainWindow):
    def __init__(self, parent = None):
        super(AppForm, self).__init__(parent)
        self.model = QStandardItemModel()
        self.view = QTreeView()
        self.view.setColumnWidth(0, 800)
        self.view.setEditTriggers(QAbstractItemView.NoEditTriggers)
        self.view.setModel(self.model)
        self.setCentralWidget(self.view)

一切都运行得很好,除了列的宽度非常窄。我本以为用setColumnWidth(0, 800)可以把第一列弄宽,但似乎没有任何效果。那设置列宽的正确方法是什么呢?

2 个回答

12
self.view.resizeColumnToContents(0)

这个确保指定的列的宽度和高度与内容相匹配。

26

当你调用 setColumnWidth 时,Qt 会做一些类似于以下的事情:

self.view.header().resizeSection(column, width)

然后,当你调用 setModel 时,Qt 会(除了其他操作)做一些类似于以下的事情:

self.view.header().setModel(model)

所以,列宽确实是被设置了——只是没有在树视图最终使用的模型上设置。

tl;dr: 在设置模型之后再设置列宽。

编辑

这里有一个基于你例子的简单演示脚本:

from PyQt4 import QtGui, QtCore

class Window(QtGui.QMainWindow):
    def __init__(self):
        QtGui.QMainWindow.__init__(self)
        self.model = QtGui.QStandardItemModel()
        self.view = QtGui.QTreeView()
        self.view.setEditTriggers(QtGui.QAbstractItemView.NoEditTriggers)
        self.view.setModel(self.model)
        self.setCentralWidget(self.view)
        parent = self.model.invisibleRootItem()
        for item in 'One Two Three Four'.split():
            parent.appendRow([
                QtGui.QStandardItem(item),
                QtGui.QStandardItem(),
                QtGui.QStandardItem(),
                ])
        self.view.setColumnWidth(0, 800)

if __name__ == '__main__':

    import sys
    app = QtGui.QApplication(sys.argv)
    window = Window()
    window.show()
    sys.exit(app.exec_())

撰写回答