首先要自己构建一个model,其实就是实现抽象类QAbstractItemModel,论述这个过程的文章有很多,比如http://devbean.blog.51cto.com/448512/268468,也可以参考pyqt提供的demo:simpletreemodel.pyw,本文中的例子就是在这个demo的基础上进行改进,实现treemodel显示图标的功能。
具体修改的地方在TreeModel类下的data函数里加入以下代码:
if role == QtCore.Qt.DecorationRole:
if index.column()>0: #只让第一列显示图标,可以根据需要进行调整 return None
node = self.nodeFromIndex(index) if node.parent() == self.rootItem : #根节点也不显示图标 return None if node.childCount()>0: #有子节点的就不显示图标 return None if node is None: return None else: pixmap = QtGui.QPixmap(":/icon1.png") if not pixmap.isNull(): return QtGui.QIcon("icon1.png") return None
由于增加了图片文件,所以还要修改这个项目的资源文件simpletreemodel.qrc,在<qresource>中加上一行关于icon1.png文件的描述,如下所示:
<!DOCTYPE RCC><RCC version="1.0"> <qresource> <file>default.txt</file> <file alias="icon1.png">icon1.png</file> </qresource> </RCC>
在将图片文件icon1.png放到工作目录下, 将其编译 pyrcc4.exe some.qrc -o someqrc.py(如果是python3,还要加上-py3选项) ,成为simpletreemodel_rc.py
再运行程序就可以看到TreeView左侧的树的子节点上带着图标了