Python:如何使用ListWidget项来存储和检索对象:简单

时间:2014-03-26 18:40:09

标签: python class qlistwidget

在使用QListWidget和其他“列表”小部件后,我终于找到了一个简单的解决方案来存储和检索List的Item类(QListWidgetItem)。我向自己介绍的问题是我认为QListWidgetItem只能用于存储其标签名称(用于在ListWidget中显示的名称)的事实。当QListWidget填充QListWidgetItems时,我必须声明一个字典,其中每个键都是项目的标签名称,并且值将等于对象本身(危险方法,因为两个或更多项目可能具有相同的名称而字典只能有一个具有相同名称的密钥)。然后,当单击一个项目时,我将捕获该List Item标签(名称)并查看字典的键以查找相应的对象。如果我声明自己的自定义myItem()类继承自QListWidgetItem,那么所有这些都可以轻松避免。现在当单击List Item时,我可以直接从它获取对象,就像我调用.getTime()方法一样。在我的代码中承诺使用这种方法之前,请告诉我是否遗漏或误解了任何内容。

from PyQt4 import QtGui, QtCore
import sys, os


class myItem(QtGui.QListWidgetItem):
    def __init__(self, name):
        super(myItem, self).__init__()
        self.name=name
    def getTime(self):
        import datetime
        return datetime.datetime.now()   

class Dialog_01(QtGui.QMainWindow):
    def __init__(self):
        super(QtGui.QMainWindow,self).__init__()

        myQWidget = QtGui.QWidget()
        myBoxLayout = QtGui.QVBoxLayout()
        myQWidget.setLayout(myBoxLayout)
        self.setCentralWidget(myQWidget)

        self.listWidget = QtGui.QListWidget()

        self.listWidget.currentItemChanged.connect(self.item_clicked)

        for i in range(12):
            name='Item '+str(i)
            my_item=myItem(name)
            my_item.setText('Item '+str(i))
            self.listWidget.addItem(my_item)

        myBoxLayout.addWidget(self.listWidget)

    def item_clicked(self, arg=None):
        print arg.text(), arg.getTime()


if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    dialog_1 = Dialog_01()
    dialog_1.show()
    dialog_1.resize(480,320)
    sys.exit(app.exec_())

4 个答案:

答案 0 :(得分:2)

您可以通过QListWidgetItem.setData (self, role, value)设置QListWidgetItem的用户数据。

您可以指定自己的角色,从而直接向此窗口小部件添加特定数据。

要检索数据,请使用具有正确角色的QListWidgetItem.data (self, role)

答案 1 :(得分:0)

谢谢!这是一次尝试。首先分配myObject:

my_item.setData (QtCore.Qt.UserRole, myObject)

然后点击,将其取回:

myObject = arg.data(QtCore.Qt.UserRole)

item_clicked上生成的myObject是。错误在哪里?

from PyQt4 import QtGui, QtCore
import sys, os


class MyClass(object):
    def __init__(self):
        super(MyClass, self).__init__()
    def getTime(self):
        import datetime
        return datetime.datetime.now()         


class Dialog_01(QtGui.QMainWindow):
    def __init__(self):
        super(QtGui.QMainWindow,self).__init__()

        myQWidget = QtGui.QWidget()
        myBoxLayout = QtGui.QVBoxLayout()
        myQWidget.setLayout(myBoxLayout)
        self.setCentralWidget(myQWidget)

        self.listWidget = QtGui.QListWidget()

        self.listWidget.currentItemChanged.connect(self.item_clicked)

        for i in range(12):
            name='Item '+str(i)
            my_item=QtGui.QListWidgetItem()
            my_item.setText('Item '+str(i))
            self.listWidget.addItem(my_item)

            myObject=MyClass()
            my_item.setData (QtCore.Qt.UserRole, myObject)

        myBoxLayout.addWidget(self.listWidget)

    def item_clicked(self, arg=None):
        myObject = arg.data(QtCore.Qt.UserRole)
        print dir(myObject)

if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    dialog_1 = Dialog_01()
    dialog_1.show()
    dialog_1.resize(480,320)
    sys.exit(app.exec_())

答案 2 :(得分:0)

我一个接一个地尝试以“”开头的每个QVariant方法:

'toBool', 'toByteArray', 'toChar', 'toDate', 'toDateTime', 'toDouble', 'toEasingCurve', 'toFloat', 'toHash', 'toInt', 'toLine', 'toLineF', 'toList', 'toLocale', 'toLongLong', 'toMap', 'toModelIndex', 'toPoint', 'toPointF', 'toPyObject', 'toReal', 'toRect', 'toRectF', 'toRegExp', 'toSize', 'toSizeF', 'toString', 'toStringList', 'toTime', 'toUInt', 'toULongLong', 'toUrl', 'toUuid'

我发现 toPyObject()返回与使用以下内容创建时列表项中存储的完全相同的对象(在下面的示例中是MyClass()实例):

        myObject=MyClass()            
        my_item.setData(QtCore.Qt.UserRole, myObject)

这是适合我的代码。如果我在这里错了,请纠正我。

from PyQt4 import QtGui, QtCore
import sys, os

class MyClass(object):
    def __init__(self):
        super(MyClass, self).__init__()
    def getTime(self):
        import datetime
        return datetime.datetime.now()         

class Dialog_01(QtGui.QMainWindow):
    def __init__(self):
        super(QtGui.QMainWindow,self).__init__()

        myQWidget = QtGui.QWidget()
        myBoxLayout = QtGui.QVBoxLayout()
        myQWidget.setLayout(myBoxLayout)
        self.setCentralWidget(myQWidget)

        self.listWidget = QtGui.QListWidget()

        self.listWidget.currentItemChanged.connect(self.item_clicked)

        for i in range(12):
            name='Item '+str(i)
            my_item=QtGui.QListWidgetItem()
            my_item.setText('Item '+str(i))
            self.listWidget.addItem(my_item)

            myObject=MyClass()            
            my_item.setData(QtCore.Qt.UserRole, myObject)

        myBoxLayout.addWidget(self.listWidget)

        Button_01 = QtGui.QPushButton("Get Items")
        Button_01.clicked.connect(self.getListItemsFromQListWidget)               
        myBoxLayout.addWidget(Button_01)

    def item_clicked(self, arg=None):
        myObject = arg.data(QtCore.Qt.UserRole)
        print myObject.toPyObject().getTime()

    def getListItemsFromQListWidget(self):
        for i in range(self.listWidget.count()):
            print self.listWidget.item(i).data(QtCore.Qt.UserRole).toPyObject().getTime()

if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    dialog_1 = Dialog_01()
    dialog_1.show()
    dialog_1.resize(480,320)
    sys.exit(app.exec_())

答案 3 :(得分:0)

这是一个相同概念的工作实现(在Qt项目中存储数据)。这次与ComboBox一起使用:

from PyQt4 import QtGui, QtCore
import sys, os

class MyClass(object):
    def __init__(self):
        super(MyClass, self).__init__()
        self.myAttr=None
    def getTime(self):
        import datetime
        return datetime.datetime.now() 

class Dialog_01(QtGui.QMainWindow):
    def __init__(self):
        super(QtGui.QMainWindow,self).__init__()

        myQWidget = QtGui.QWidget()
        myBoxLayout = QtGui.QVBoxLayout()
        myQWidget.setLayout(myBoxLayout)
        self.setCentralWidget(myQWidget)

        self.ComboBox = QtGui.QComboBox() 
        for i in range(12):
            name='Item '+str(i)
            myObject=MyClass()
            self.ComboBox.addItem( name, myObject )

        self.ComboBox.currentIndexChanged.connect(self.combobox_selected)
        myBoxLayout.addWidget(self.ComboBox)

    def combobox_selected(self, index):
        myObject=self.ComboBox.itemData(index).toPyObject()
        print myObject.getTime()

if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    dialog_1 = Dialog_01()
    dialog_1.show()
    dialog_1.resize(480,320)
    sys.exit(app.exec_())