2011-12-02 225 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(),而不是列 –