2017-12-22 6 views
0

QlistWidgetItem에 in과 함께 저장된 객체를 설정하려고합니다. setData 함수를 사용하여이 작업을 수행하고 있습니다. 항목 A에있는 동안 항목에 저장되도록 데이터를 가져올 수 있습니다. 그러나 QlistWidgetItem을 목록 B로 이동하려고하면 목록 A에 있던 데이터가 손실됩니다. listA.item에서 데이터를 가져온 다음 listB.item을 만들 때 같은 방법으로 거기에 저장하지만 성공하지 못했습니다.PyQt 4 목록에서 목록으로 데이터를 보유하는 QListWidgetItem

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

답변

1

당신이 다른 하나의 QListWidget에서 QListWidgetItem 텍스트를 복사 할 것입니다, 당신은 QListWidgetItem를 이동하지 않습니다. takeItem() 메서드는 부모가없는 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) 
+0

도움 주셔서 감사합니다. 나는 그 기능을 제대로 살펴 보았 음에 틀림 없다. –

관련 문제