2011-12-02 228 views
9

忍受着我,我对QT还是一个新手,并且无法绕着我的大脑围绕它如何做事。如何在QTreeView上设置列宽?

我创建并填充一个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)会扩大第一列,但它似乎没有任何影响。什么是设置列宽的正确方法?

回答

13

当你调用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_()) 
+0

我将setColumnWidth移动到setModel下面,但它似乎仍然没有效果。问题是我没有填充它或设置列的数量吗? – ashground

+0

@ashground。我在我的答案中添加了一个演示脚本。 – ekhumoro

+0

太棒了 - 我将setColumnWidth移动到了一个不同的函数中,以便在填充树之后调用它。一切都如预期般运作。谢谢你的帮助! – ashground

9
self.view.resizeColumnsToContents() 

这可以确保列宽和高度都设置与其内容相匹配。

+0

QTreeView的对象没有属性resizeColumnsToContents' – Sophus

+0

resizeColumnToContents(),而不是列 –