如何设置QTreeView的列宽?
请耐心点,我对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_())