2014-03-26 28 views
1

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

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_()) 

回答

2

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

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

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

+0

感谢Hyperboreus!我刚刚提到了一个采用上述方法的例子。在检索数据之后获取。怎么了? – alphanumeric

+0

很高兴帮助... – Hyperboreus

+1

所以,只是为了确保,.toPyObject()方法是获取存储数据的方法......是否正确? – alphanumeric

0

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

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

然后在点击,以获得回:

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

所得myObject的上item_clicked是。错误在哪里?

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_()) 
+0

有什么建议吗? – alphanumeric

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()实例)存储在创建时使用的List Item中:

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

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

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_()) 
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_()) 
相关问题