[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