如何在QTreeView上设置列宽?

16

请耐心等待,我对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个回答

24

当您调用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_())

我将setColumnWidth移动到setModel下面,但似乎仍然没有效果。问题是我还没有填充或设置列数吗? - ashground
@ashground。我在我的答案中添加了一个演示脚本,对我来说很有效。 - ekhumoro
太棒了 - 我将setColumnWidth移入另一个函数中,以便在填充树之后调用它。现在一切都像预期的那样工作了。感谢您的帮助! - ashground

12
self.view.resizeColumnToContents(0)

此函数会确保所给定的列宽和高与内容匹配。


QTreeView对象没有'resizeColumnsToContents'属性。 - Sophus
调整列宽以适应内容大小,而不是列数。 - Liao Zhuodi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接