[PyQt] Resize columns in QTreeView
Gionata Boccalini
gion at ngi.it
Mon Nov 22 19:56:35 GMT 2010
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...
Thanks for your help, and you time!!!!
--
Gionata Boccalini
More information about the PyQt
mailing list