pyqt 在QTreeView里使用复选框checkbox

这里以pyqt自带demo中的simpletreemode.pyw文件为例,简单介绍在pyqt的TreeView里使用checkbox。所有的工作实际上都是在TreeModel类中完成的。

首先,在TreeModel类的__init__函数中加入self.checkLisk = []这句话,定义一个list用来保存被选中的checkbox信息。

第二步,修改flag函数

def flags(self, index): if not index.isValid() : return QtCore.Qt.NoItemFlags result = QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsSelectable if index.column()==0: #只让第一列显示checkbox result |= QtCore.Qt.ItemIsUserCheckable return result

主要就是为第一例的显示方式增加了一个ItemIsUserCheckable

 

然后,再在data函数中,进行如下修改

def data(self, index, role): if not index.isValid(): return None item = index.internalPointer() if role == QtCore.Qt.CheckStateRole: #被选中项是checkbox if item.parent() == self.rootItem: #如果是根的话,直接返回 return None if item.childCount()>0: #如果是有子项的话,直接返回,这个可以根据需要调整。当需要成组选择的时候,必须保留 return None if index.column()==0: for x in self.checkLisk: #检查该项是否在checkList中,如果在将其设为选中状态 if x == index: return QtCore.Qt.Checked else: return QtCore.Qt.Unchecked if role != QtCore.Qt.DisplayRole: return None return item.data(index.column())

 

最后,增加setData函数,这个函数在simpletreemodel.pyw中,并不存在,它是QAbstractItemModel中定义的函数,当TreeModel中的项发生变化是,会调用这个函数,并且需要这个函数发出一个dataChanged信号。在这个函数中,需要判断改动的项目是否是checkbox,并且根据改动情况对checkList进行修改。然后发送dataChanged信号。虽然我不知道dataChange的槽函数都进行了那些工作,但它肯定调用了相应的data函数,然后,会将刚才点击复选框的内容进行重设

def setData(self, index, value, role=QtCore.Qt.EditRole): if role == QtCore.Qt.CheckStateRole and index.column()==0: if value == QtCore.Qt.Unchecked: #撤销选中的情况 self.checkLisk.remove(index) #将节点的index从checklist中移除 self.emit(QtCore.SIGNAL("dataChanged(QModelIndex,QModelIndex)"), index, index) else: #选中的情况 self.checkLisk.append(index) #将节点的index加到checklist中 self.emit(QtCore.SIGNAL("dataChanged(QModelIndex,QModelIndex)"), index, index) return True

 

代码在http://download.csdn.net/source/3019094

你可能感兴趣的:(pyqt 在QTreeView里使用复选框checkbox)