python - QListWidgetItem 保存列表之间的数据

标签 python python-2.7 pyqt pyqt4 qlistwidget

我正在尝试设置 QlistWidgetItem 以将对象存储在 in 中。我正在使用 setData 函数来实现此目的。我可以将数据存储在列表 A 中的项目中。但是,我尝试将 QlistWidgetItem 移动到列表 B,这样做时,它会丢失列表 A 中的数据。我尝试读取将数据从 listA.item 中取出,然后在创建 listB.item 时使用相同的方法将其存储在其中,但没有成功。

http://doc.qt.io/archives/qt-4.8/qlistwidgetitem.html#setData

请参阅下面的代码,因为它是我正在尝试做的事情的示例。如果运行下面的程序,您将看到它将示例项目加载到底部列表中。然后,我尝试将列表移至顶部并移回底部,同时将数据元素保留在内部,但它在此过程中丢失了。任何帮助都会很棒!

import sys
from PyQt4 import QtGui, QtCore

class Struct():
    def __init__(self,row):
        self.hotkey=row['hotkey']
        self.command=row["COMMAND"]

class Example(QtGui.QWidget):

    def __init__(self):
        super(Example, self).__init__()
        self.setMinimumSize(600, 400)
        self.initUI()

    def initUI(self):      

        self.pushButton = QtGui.QPushButton(self)
        self.pushButton.setGeometry(QtCore.QRect(90, 630, 100, 41))
        self.pushButton.setObjectName(("pushButton"))
        self.listWidget = QtGui.QListWidget(self)
        self.listWidget.setGeometry(QtCore.QRect(20, 90, 261, 220))
        self.listWidget.setObjectName(("listWidget"))
        self.listWidget_2 = QtGui.QListWidget(self)
        self.listWidget_2.setGeometry(QtCore.QRect(20, 379, 261, 211))
        self.listWidget_2.setObjectName(("listWidget_2"))
        self.pushButton_2 = QtGui.QPushButton(self)
        self.pushButton_2.setGeometry(QtCore.QRect(160, 320, 31, 31))
        self.pushButton_2.setObjectName(("pushButton_2"))
        self.pushButton_3 = QtGui.QPushButton(self)
        self.pushButton_3.setGeometry(QtCore.QRect(100, 320, 31, 31))
        self.pushButton_3.setObjectName(("pushButton_3"))
        self.pushButton.clicked.connect(self.testData)
        self.pushButton_2.clicked.connect(self.moveItemsTopToBottom)
        self.pushButton_3.clicked.connect(self.moveItemsBottomToTop)
        self.loadRightList()
        self.loadLeftList()
        self.listWidget_2.setSelectionMode(QtGui.QAbstractItemView.ExtendedSelection)
        self.listWidget.setSelectionMode(QtGui.QAbstractItemView.ExtendedSelection)
        self.show()


    def testData(self, state):
        print self.listWidget_2.item(0).text()
        print self.listWidget_2.item(0).data(32).toPyObject().hotkey
    def moveItemsTopToBottom(self,state): 
        for i in self.listWidget.selectedItems():
            x= i.data(32).toPyObject()
            self.listWidget_2.addItem(i.text())
            self.listWidget.takeItem(self.listWidget.row(i))
            item_num=self.listWidget.count()-1
        return
    def moveItemsBottomToTop(self,state): 
        for i in self.listWidget_2.selectedItems():
            self.listWidget.addItem(i.text())
            self.listWidget_2.takeItem(self.listWidget_2.row(i))
            item_num=self.listWidget_2.count()-1
            self.listWidget_2.item(item_num)
        return
    def loadLeftList(self):

        results = []
        if (results!=[]):
            for i in results:
                self.listWidget.addItem(i['NAME'])
                item_num=self.listWidget.count()-1
                self.listWidget.item(item_num).setToolTip(i['COMMAND'])
                x=Struct(i)
                self.listWidget.item(item_num).setData(32,x)
        return
    def loadRightList(self):

        results= [{'NAME': 'Example Query 1', 'TEAM_CD': 1, 'TYPE_CD': 0, 'COMMAND': 'SELECT * FROM CHARGE C WHERE C.ACTIVE_IND = 1', 'hotkey': 'cinfo', 'COMMAND_ID': 2}]
        if (results!=None):
            for i in results:
                self.listWidget_2.addItem(i['NAME'])
                item_num=self.listWidget_2.count()-1
                self.listWidget_2.item(item_num).setToolTip(i['COMMAND'])
                x=Struct(i)
                self.listWidget_2.item(item_num).setData(32,x)
                print self.listWidget_2.item(item_num).data(32).toPyObject().hotkey
        else:   
            return None


def main():
    app = QtGui.QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())


if __name__ == '__main__':
    main()

最佳答案

我在您的代码中看到的是,您将QListWidgetItem文本从一个QListWidget复制到另一个QListWidget,您没有移动QListWidgetItemtakeItem() 方法返回没有父项的 QListWidgetItem,因此您只需将其添加到另一个即可。

class Example(QtGui.QWidget):

    def __init__(self):
        super(Example, self).__init__()
        self.setMinimumSize(600, 400)
        self.initUI()

    def initUI(self):      
        lay = QtGui.QVBoxLayout(self)
        self.topListWidget = QtGui.QListWidget(self)
        self.bottomListWidget = QtGui.QListWidget(self)
        toTopButton = QtGui.QPushButton("to top", self)
        toBottomButton = QtGui.QPushButton("to bottom", self)
        printButton = QtGui.QPushButton("print", self)
        hlay = QtGui.QHBoxLayout()
        hlay.addWidget(toBottomButton)
        hlay.addWidget(toTopButton)
        lay.addWidget(self.topListWidget)
        lay.addLayout(hlay)
        lay.addWidget(self.bottomListWidget)
        lay.addWidget(printButton)

        self.topListWidget.setSelectionMode(QtGui.QAbstractItemView.ExtendedSelection)
        self.bottomListWidget.setSelectionMode(QtGui.QAbstractItemView.ExtendedSelection)

        self.show()
        printButton.clicked.connect(self.testData)
        self.loadRightList()
        toBottomButton.clicked.connect(self.moveItemsTopToBottom)
        toTopButton.clicked.connect(self.moveItemsBottomToTop)


    def testData(self, state):
        for i in range(self.topListWidget.count()):
            it = self.topListWidget.item(i)
            print("top: ", it.data(QtCore.Qt.UserRole).toPyObject().hotkey)

        for i in range(self.bottomListWidget.count()):
            it = self.bottomListWidget.item(i)
            print("bottom: ", it.data(QtCore.Qt.UserRole).toPyObject().hotkey)


    def moveItemsTopToBottom(self,state): 
        for item in self.topListWidget.selectedItems():
            it = self.topListWidget.takeItem(self.topListWidget.row(item))
            self.bottomListWidget.addItem(it)

    def moveItemsBottomToTop(self,state): 
        for item in self.bottomListWidget.selectedItems():
            it = self.bottomListWidget.takeItem(self.bottomListWidget.row(item))
            self.topListWidget.addItem(it)

    def loadRightList(self):
        results= [{'NAME': 'Example Query 1', 'TEAM_CD': 1, 'TYPE_CD': 0, 'COMMAND': 'SELECT * FROM CHARGE C WHERE C.ACTIVE_IND = 1', 'hotkey': 'cinfo', 'COMMAND_ID': 2}]
        for result in results:
            item = QtGui.QListWidgetItem(result["NAME"])
            item.setToolTip(result["COMMAND"])
            item.setData(QtCore.Qt.UserRole, Struct(result))
            self.topListWidget.addItem(item)

关于python - QListWidgetItem 保存列表之间的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47944013/

相关文章:

python - 如何将 JPG 图像的整数数组转换为 JPG 图像?

javascript - 如何在 Python Webdriver 中执行 javascript

python - Matplotlib 表落在绘图区域之外

python - PyQt5 QGraphicsPathItem 由 QPainter 绘制

python - 为 QPolygonItem 着色

python - 如何选择水平 Lollipop 图/哑铃图的最小值和最大值?

Python CSV : Find identical data in two CSV files and copy corresponding data

python-2.7 - 如何检测透明容器中的水位?

python - 正则化网页中的行

python - 使用 PyQt4 进行 OpenCV 视频捕获