如何从.model()存储和获取数据

2024-04-24 23:52:29 发布

您现在位置:Python中文网/ 问答频道 /正文

下面的代码用.model()创建一个QListView。 在itemClicked上,我试图访问index.data(),以获得它先前用self.setData(index, QtCore.QVariant(inst))存储的值。但它不是返回存储的值(例如['Bison','Panther','Elephant']['Duck','Hawk','Pigeon']),而是返回键的名称(例如'Animals''Birds'或{})。为了使代码按预期工作,应该对代码进行哪些更改?在

enter image description here

from PyQt4 import QtCore, QtGui
app=QtGui.QApplication(sys.argv) 

class Model(QtCore.QAbstractListModel):
    def __init__(self, *args):
        QtCore.QAbstractListModel.__init__(self, *args)
        self.items=[]    
    def rowCount(self, parent=QtCore.QModelIndex()):
        return len(self.items)    
    def data(self, index, role=QtCore.Qt.DisplayRole):
        if index.isValid():
            if role == QtCore.Qt.ItemDataRole:
                return self.data(index)
            elif role==QtCore.Qt.DisplayRole:                
                return QtCore.QVariant(self.items[index.row()])

    def addItems(self, instDict):
        for key in instDict:
            inst=instDict.get(key)
            index=QtCore.QModelIndex()
            self.beginInsertRows(index, 0, 0)
            self.setData(index, QtCore.QVariant(inst))    
        self.items.extend(instDict)
        self.endInsertRows()

class ListView(QtGui.QListView):
    def __init__(self):
        super(ListView, self).__init__()
        self.model= Model()
        self.model.addItems({'Animals':['Bison','Panther','Elephant'],'Birds':['Duck','Hawk','Pigeon'],'Fish':['Shark','Salmon','Piranha']})
        self.setModel(self.model)
        self.clicked.connect(self.itemClicked)
        self.show()
    def itemClicked(self, index):
        print 'self.data(index).toString(): %s'%index.data().toString()
        print 'self.model.data(index).toString(): %s'%self.model.data(index).toString()

window=ListView()
sys.exit(app.exec_())

稍后编辑:

下面是一个使用嵌套字典作为数据参数的完整示例。在

^{pr2}$

Tags: 代码selfdataindexmodelinitdefitems
1条回答
网友
1楼 · 发布于 2024-04-24 23:52:29
from PyQt4 import QtCore, QtGui
app=QtGui.QApplication(sys.argv) 

class Model(QtCore.QAbstractListModel):
    def __init__(self, *args):
        QtCore.QAbstractListModel.__init__(self, *args)
        self.items=[]
        self.modelDict = None

    def rowCount(self, parent=QtCore.QModelIndex()):
        return len(self.items)   

    def data(self, index, role=QtCore.Qt.DisplayRole):
        if index.isValid():
            if role == QtCore.Qt.ItemDataRole:
                return self.data(index)
            elif role==QtCore.Qt.DisplayRole:
                return QtCore.QVariant(self.items[index.row()])

    def getData(self, data):
        return self.modelDict[str(data)]

    def addItems(self, instDict):
        for key in instDict:
            inst=instDict.get(key)
            index=QtCore.QModelIndex()
            self.beginInsertRows(index, 0, 0)
            self.setData(index, QtCore.QVariant(inst), QtCore.Qt.DisplayRole)
        self.items.extend(instDict)
        self.endInsertRows()
        self.modelDict = instDict

class ListView(QtGui.QListView):
    def __init__(self):
        super(ListView, self).__init__()
        self.model= Model()
        self.model.addItems({'Animals':['Bison','Panther','Elephant'],'Birds':['Duck','Hawk','Pigeon'],'Fish':['Shark','Salmon','Piranha']})
        self.setModel(self.model)
        self.clicked.connect(self.itemClicked)
        self.show()

    def itemClicked(self, index):
        print 'self.data(index).toString(): %s'%index.data().toString()
        print 'self.model.data(index).toString(): %s'%self.model.getData(index.data().toString())

window=ListView()
sys.exit(app.exec_())

我不确定这是不是正确的方法,但这是有效的:)

相关问题 更多 >