[PyQt] Resize columns in QTreeView
Hans-Peter Jansen
hpj at urpla.net
Mon Nov 22 22:21:17 GMT 2010
On Monday 22 November 2010, 20:56:35 Gionata Boccalini wrote:
> Hi, I am doing a small file browser with 2 QTreeView (treeView and
> fileView) linked with 2 different QFileSystemModel (dirModel and
> fileModel): when the user selects a folder on the left view I want
> the contents of that folder to be displayed in the right view, (only
> the files are shown in the right view while only folder are shown in
> the left view...).
> This is the constructor method, in short:
>
> class FileBrowser(QWidget):
> def __init__(self, parent = None):
> super(FileBrowser, self).__init__(parent)
> self.treeView = QtGui.QTreeView()
> self.treeView.setSortingEnabled (True)
> self.dirModel = QtGui.QFileSystemModel()
> self.dirModel.setFilter(QDir.AllDirs | QDir.NoDotAndDotDot)
> self.treeView.setModel(self.dirModel)
>
> # Path
> rootindex = self.dirModel.setRootPath(QDir.rootPath())
> homeindex = self.dirModel.index(QDir.homePath())
>
> self.treeView.setRootIndex(rootindex)
> self.treeView.scrollTo(homeindex,
> QtGui.QAbstractItemView.PositionAtTop)
> self.treeView.expand(homeindex)
> self.treeView.resizeColumnToContents(0)
> self.treeView.sortByColumn(0, Qt.AscendingOrder)
>
> sizePolicy = QSizePolicy(QSizePolicy.Expanding,
> QSizePolicy.Expanding)
> self.treeView.setSizePolicy(sizePolicy)
> self.treeView.setAlternatingRowColors(True)
> self.treeView.setAnimated(True)
> self.treeView.hideColumn(1)
> self.treeView.hideColumn(2)
>
> ....
> self.fileModel = QtGui.QFileSystemModel()
> #self.fileModel.setFilter(QDir.Files)
> self.fileView = QtGui.QTreeView()
> self.fileView.setModel(self.fileModel)
> self.fileModel.setRootPath(QDir.rootPath())
> homeindex = self.fileModel.index(QDir.homePath())
>
> .......
> ....
>
> self.fileView.setRootIndex(homeindex)
> self.fileView.setSizePolicy(sizePolicy)
> self.fileView.setSortingEnabled (True)
> self.fileView.sortByColumn(2, Qt.AscendingOrder)
> self.fileView.setAlternatingRowColors(True)
> self.fileView.setAnimated(True)
>
> # Signals
> self.treeView.clicked.connect(self.updateFiles)
> ...
> ...
>
>
>
> The problem is the resizeColumnToContents(0) method of QtreeView,
> which is called in a slot on the "clicked" QTreeView signal: when I
> click on the folder in the left view the first column is resized, but
> the first column of the right view is resized only on the second
> click on the same folder (on the left view.... quite tricky to
> explain....)!!! This is the code I am using in the slot for the
> clicked() signal:
>
> @QtCore.pyqtSlot('QModelIndex')
> def updateFiles(self, index):
> path = self.dirModel.filePath(index)
> fileIndex = self.fileModel.index(path)
> self.fileView.setRootIndex(fileIndex)
>
> self.treeView.resizeColumnToContents(0)
> self.fileView.resizeColumnToContents(0)
>
>
> The first column shrinks only on the second click, so on the second
> signal...
> If I comment out the line self.fileView.setRootIndex(fileIndex) the
> resize goes as it should, but the treeView is not updated with the
> new files..
> Maybe there is a better way to do it all, but I haven't found a good
> example on the net, so I am trying to do that myself. Anyway I hope
> I've explained it well...
I remember having similar issues, that I was able to workaround with
delaying the calls to resizeColumnToContents with
QTimer.singleShot(0, ...)
Might be worth a try..
Pete
More information about the PyQt
mailing list