15

请耐心等待,我还是 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) 会加宽第一列,但它似乎没有任何效果。设置列宽的正确方法是什么?

4

2 回答 2

22

当您调用 时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_())
于 2011-12-03T00:57:20.413 回答
11
self.view.resizeColumnToContents(0)

确保给定列的宽度和高度设置为与内容匹配。

于 2012-06-09T08:34:17.530 回答