[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