Search code examples
python-3.xpyqt5qlistwidget

How exchange many items between 2 QListWidget?


I've a new question for you. I've 2 QListWidget with many items. I want to select many items, click on a button and also cut/paste in the second QListWidget and vice versa.

Someone knows how can I do that ???

this is the beginning of my development:

from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
    MainWindow.setObjectName("MainWindow")
    MainWindow.resize(816, 603)
    self.centralwidget = QtWidgets.QWidget(MainWindow)
    self.centralwidget.setObjectName("centralwidget")
    self.listWidget1 = QtWidgets.QListWidget(MainWindow)
    self.listWidget1.setGeometry(QtCore.QRect(370, 120, 151, 311))
    self.listWidget1.setObjectName("listWidget1")
    self.listWidget1.setSelectionMode(QtWidgets.QAbstractItemView.MultiSelection)
    item = QtWidgets.QListWidgetItem()
    self.listWidget1.addItem(item)
    item = QtWidgets.QListWidgetItem()
    self.listWidget1.addItem(item)
    self.listWidget_2 = QtWidgets.QListWidget(MainWindow)
    self.listWidget_2.setGeometry(QtCore.QRect(600, 120, 151, 311))
    self.listWidget_2.setObjectName("listWidget_2")
    self.listWidget_2.setSelectionMode(QtWidgets.QAbstractItemView.MultiSelection)
    self.pushButton_3 = QtWidgets.QPushButton(MainWindow)
    self.pushButton_3.setGeometry(QtCore.QRect(540, 220, 51, 21))
    self.pushButton_3.setObjectName("pushButton_3")
    self.pushButton_4 = QtWidgets.QPushButton(MainWindow)
    self.pushButton_4.setGeometry(QtCore.QRect(540, 270, 51, 21))
    self.pushButton_4.setObjectName("pushButton_4")
    self.retranslateUi(MainWindow)
    QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
    _translate = QtCore.QCoreApplication.translate
    MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
    __sortingEnabled = self.listWidget1.isSortingEnabled()
    self.listWidget1.setSortingEnabled(False)
    item = self.listWidget1.item(0)
    item.setText(_translate("MainWindow", "test1"))
    item = self.listWidget1.item(1)
    item.setText(_translate("MainWindow", "test2"))
    self.listWidget1.setSortingEnabled(__sortingEnabled)
    self.pushButton_3.setText(_translate("MainWindow", "-->"))
    self.pushButton_4.setText(_translate("MainWindow", "<--"))
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
MainWindow = QtWidgets.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.exec_())

Solution

  • I just find the answer. I put the result here if one day someone has the same problem.

    I created a new fonction when Iclicked on the button and used the 3 fonctions: - selectedIndexes - takeItem (to remove from the first QListWidget) - addItem (to add the item in the second QListWidget)

    def click_pushButton(self):
    # sort rows in descending order in order to compensate shifting due to takeItem
    
        rows = sorted([index.row() for index in self.listWidget1.selectedIndexes()],
                  reverse=True)
        print('AAA')
        for row in rows:
            # assuming the other listWidget is called listWidget_2
            self.listWidget_2.addItem(self.listWidget1.takeItem(row))