【发布时间】:2014-09-17 11:47:35
【问题描述】:
下面的代码创建了一个包含三个项目的 QListView。此 QListView 通过其 .model 填充。如果不使用该模型,我可以继续执行以下操作:
view=QtGui.QListWidget()
item=QtGui.QListWidgetItem()
item.setText('Item Name')
icon=QtGui.QIcon('/Volumes/path/to/file.jpg')
item.setIcon(icon)
view.addItem(item)
但是在使用 `.model' 时没有可用的项目(取而代之的是索引)。请指教。
import os,sys
from PyQt4 import QtCore, QtGui
app=QtGui.QApplication(sys.argv)
elements={'Animals':{1:'Bison',2:'Panther',3:'Elephant'},'Birds':{1:'Duck',2:'Hawk',3:'Pigeon'},'Fish':{1:'Shark',2:'Salmon',3:'Piranha'}}
class Model(QtCore.QAbstractListModel):
def __init__(self):
QtCore.QAbstractListModel.__init__(self)
self.items=[]
self.modelDict={}
def rowCount(self, parent=QtCore.QModelIndex()):
return len(self.items)
def data(self, index, role):
if not index.isValid() or not (0<=index.row()<len(self.items)): return QtCore.QVariant()
if role==QtCore.Qt.DisplayRole: return self.items[index.row()]
def addItems(self):
for key in self.modelDict:
index=QtCore.QModelIndex()
self.beginInsertRows(index, 0, 0)
self.items.append(key)
self.endInsertRows()
class ListView(QtGui.QListView):
def __init__(self):
super(ListView, self).__init__()
self.model= Model()
self.model.modelDict=elements
self.model.addItems()
self.setModel(self.model)
self.show()
window=ListView()
sys.exit(app.exec_())
编辑:感谢 Jeffrey 的详细解释!
下面的代码是之前发布的代码的完整修改版本。基本上我们必须为模型提供所请求的数据。实际的图标“分配”将由模型本身处理。我们只需要确保图标请求发生在正确的if Role==x 范围内。图标应在.data() 方法的if DecorationRole 部分中请求/返回。还有其他可用的角色:Qt.DisplayRole, Qt.TextAlignmentRole, Qt.TextColorRole, Qt.BackgroundColorRole, Qt.ItemDataRole, Qt.UserRole 等)
import os,sys
from PyQt4 import QtCore, QtGui
app=QtGui.QApplication(sys.argv)
elements={'Animals':{1:'Bison',2:'Panther',3:'Elephant'},'Birds':{1:'Duck',2:'Hawk',3:'Pigeon'},'Fish':{1:'Shark',2:'Salmon',3:'Piranha'}}
icon=QtGui.QIcon('C:\\myIcon.png')
class Model(QtCore.QAbstractListModel):
def __init__(self):
QtCore.QAbstractListModel.__init__(self)
self.items=[]
self.modelDict={}
def rowCount(self, parent=QtCore.QModelIndex()):
return len(self.items)
def data(self, index, role):
if not index.isValid() or not (0<=index.row()<len(self.items)): return QtCore.QVariant()
if role==QtCore.Qt.DisplayRole:
return self.items[index.row()]
elif role==QtCore.Qt.DecorationRole:
return icon
def addItems(self):
for key in self.modelDict:
index=QtCore.QModelIndex()
self.beginInsertRows(index, 0, 0)
self.items.append(key)
self.endInsertRows()
class ListView(QtGui.QListView):
def __init__(self):
super(ListView, self).__init__()
self.model= Model()
self.model.modelDict=elements
self.model.addItems()
self.setModel(self.model)
self.show()
window=ListView()
sys.exit(app.exec_())
【问题讨论】: