[PyQt] Qtreeview/QDirmodel with check-boxes
Jon Noble
jonnobleuk at gmail.com
Mon May 31 02:10:12 BST 2010
On Monday 31 May 2010 00:07:43 Jon Noble wrote:
> Hi,
>
> I'm trying to create a file-system tree-view with checkboxes yet i'm having
> great difficulties on doing so.
>
> I found a link
> (http://lists.trolltech.com/qt-interest/2005-08/msg00516.html) but I'm not
> really sure what the solution is. I've tried one solution which is to use
> QDirModel.setData() but that makes no difference.
>
> Here's a snippet of my code.
>
> def __fileview_setup(self):
> """
> Make the fileview the correct type
> """
>
> index = QModelIndex()
> dir_model = QDirModel()
> filters = QDir.AllDirs|QDir.Readable|QDir.NoDotAndDotDot
> dir_model.setData(index, Qt.Checked, Qt.CheckStateRole)
> dir_model.setFilter(filters)
> dir_model.setReadOnly(True)
>
> # self.collection_view is a QTreeView
> self.collection_view.setModel(dir_model)
> self.collection_view.setColumnHidden(1, True)
> self.collection_view.setColumnHidden(2, True)
> self.collection_view.setColumnHidden(3, True)
> self.collection_view.expandToDepth(0)
>
> The file-system view part works fine, just no checkboxes.
>
> Any help would be greatly recieved, thanks.
>
> Jon
Never mind. I found a useful link that helped me solve my issue
http://www.qtcentre.org/threads/6957-QDirModel-QTreeView-and-checkable-items
Whilst not knowing c++ and Qt (QSet and the c++ "?" was a bit of a bafflement)
i'm able to create a filesystem tree with checkable directories. It seems to
work well apart from you don't see the checked box until you move the mouse
away from the checkbox. That's a bit strange.
Here's the code:
class MyQDirModel(QDirModel):
checked = []
def data(self, index, role = Qt.DisplayRole):
if index.isValid() and (index.column() == 0) and (role ==
Qt.CheckStateRole):
# the item is checked only if we have stored its path
print MyQDirModel.checked, unicode(self.filePath(index))
if unicode(self.filePath(index)) in MyQDirModel.checked:
return Qt.Checked
else:
return Qt.Unchecked
return QDirModel.data(self, index, role)
def flags(self, index):
if (index.column() == 0): # make the first column checkable
return QDirModel.flags(self, index) | Qt.ItemIsUserCheckable
else:
return QDirModel.flags(self, index)
def setData(self, index, value, role = Qt.EditRole):
if index.isValid() and (index.column() == 0) and role ==
Qt.CheckStateRole:
# store checked paths, remove unchecked paths
if (value == Qt.Checked):
MyQDirModel.checked.append(unicode(self.filePath(index)))
return False
else:
MyQDirModel.checked.remove(unicode(self.filePath(index)))
return False
else:
return QDirModel.setData(self, index, value, role);
I am interacting with it in another class and method:
def __fileview_setup(self):
"""
Make the fileview the correct type
"""
index = QModelIndex()
dir_model = MyQDirModel()
filters = QDir.AllDirs|QDir.Readable|QDir.NoDotAndDotDot
dir_model.setData(index, Qt.Checked, Qt.CheckStateRole)
dir_model.setFilter(filters)
dir_model.setReadOnly(True)
self.collection_view.setModel(dir_model)
self.collection_view.setColumnHidden(1, True)
self.collection_view.setColumnHidden(2, True)
self.collection_view.setColumnHidden(3, True)
self.collection_view.expandToDepth(0)
Hope this helps someone as PyQt4 documentation/examples are sparse out there
in the internet.
Regards
Jon
More information about the PyQt
mailing list