컴퓨터/Python

pyqt5 listwidget to listwidget

풍경소리^^ 2022. 6. 22. 09:41

listwidgettolistwidgetrename.py--------------------

import sys
# from PyQt5 import QtWidgets
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QListWidget, QGridLayout, \
                            QHBoxLayout, QVBoxLayout, QSizePolicy, QAbstractItemView
from PyQt5.QtCore import Qt
class MyApp(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("Moving Items Between List Widgets")
        self.window_width, self.window_height = 1200, 800
        self.setMinimumSize(self.window_width, self.window_height)
        self.initUI()
        self.updateButtonStatus()
        self.setButtonConnections()
    def initUI(self):
        layout = QHBoxLayout()
        self.setLayout(layout)
        # subLayouts = {}
        # subLayouts['LeftColumn'] = QGridLayout()
        # subLayouts['RightColumn'] = QVBoxLayout()
        # self.layout.addLayout(subLayouts['LeftColumn'], 1)
        # self.layout.addLayout(subLayouts['RightColumn'], 1)
        layout_leftcolumn = QGridLayout()
        layout_rightcolumn = QVBoxLayout()
        layout.addLayout(layout_leftcolumn)
        layout.addLayout(layout_rightcolumn)
        self.buttons = {}
        self.buttons['>>'] = QPushButton('&>>')
        self.buttons['>'] = QPushButton('>')
        self.buttons['<'] = QPushButton('<')
        self.buttons['<<'] = QPushButton('&<<')
        # self.buttons['Up'] = QPushButton('&Up')
        # self.buttons['Down'] = QPushButton('&Down')
        for k in self.buttons:
            self.buttons[k].setSizePolicy(QSizePolicy.Minimum, QSizePolicy.Fixed)
        """
        First Column
        """
        self.listWidgetLeft = QListWidget()
        # self.listWidgetLeft.setSelectionMode(2) # 여러행 선택
        self.listWidgetLeft.setSelectionMode(QAbstractItemView.MultiSelection)
        # ====================== 더미 데이터
        str = "ABCDEFGHIJK"
        my_list = list(str)
        for i in enumerate(my_list):
            self.listWidgetLeft.addItem('Item {0}'.format(i[1]))
        # for i in range(10):
            # self.listWidgetLeft.addItem('Item {0}'.format(list("ABCDEFGHIJK")[i]))
        # ====================== 더미 데이터
        layout_leftcolumn.addWidget(self.listWidgetLeft, 1, 0, 4, 4)
        layout_leftcolumn.setRowStretch(4, 1)
        layout_leftcolumn.addWidget(self.buttons['>>'], 1, 4, 1, 1, alignment=Qt.AlignTop)
        layout_leftcolumn.addWidget(self.buttons['>'], 2, 4, 1, 1, alignment=Qt.AlignTop)
        layout_leftcolumn.addWidget(self.buttons['<'], 3, 4, 1, 1, alignment=Qt.AlignTop)
        layout_leftcolumn.addWidget(self.buttons['<<'], 4, 4, 1, 1, alignment=Qt.AlignTop)
        """
        Second Column
        """
        self.listWidgetRight = QListWidget()
        hLayout = QHBoxLayout()
        layout_rightcolumn.addLayout(hLayout)
        hLayout.addWidget(self.listWidgetRight)
        # vLayout = QVBoxLayout()
        # hLayout.addLayout(vLayout, 1)
        # vLayout.addWidget(self.buttons['Up'])
        # vLayout.addWidget(self.buttons['Down'])
        # vLayout.addStretch(1)
    def setButtonConnections(self):
        self.listWidgetLeft.itemSelectionChanged.connect(self.updateButtonStatus)
        self.listWidgetRight.itemSelectionChanged.connect(self.updateButtonStatus)
        self.buttons['>'].clicked.connect(self.buttonAddClicked)
        self.buttons['<'].clicked.connect(self.buttonRemoveClicked)
        self.buttons['>>'].clicked.connect(self.buttonAddAllClicked)
        self.buttons['<<'].clicked.connect(self.buttonRemoveAllClicked)
        # self.buttons['Up'].clicked.connect(self.buttonUpClicked)
        # self.buttons['Down'].clicked.connect(self.buttonDownClicked)
    def buttonAddClicked(self):
        itemsLeft = self.listWidgetLeft.selectedItems()
        itemsRight =  [str(self.listWidgetRight.item(i).text()) for i in range(self.listWidgetRight.count())]
        if len(itemsRight)==0:
            for i in range(len(itemsLeft)):
                    self.listWidgetRight.addItem(itemsLeft[i].text())
        else:
            for i in range(len(itemsLeft)):
                samecount = 0
                for j in range(len(itemsRight)):
                    if itemsLeft[i].text() == itemsRight[j]:
                        samecount += 1
                        break
                if samecount == 0:
                    self.listWidgetRight.addItem(itemsLeft[i].text())
        self.listWidgetRight.setSortingEnabled(True)
    def buttonRemoveClicked(self):
        currentitemRight = self.listWidgetRight.currentItem()
        currentrowRight = self.listWidgetRight.currentRow()
        self.listWidgetRight.takeItem(currentrowRight) # currentrowRight번째 항목을 삭제합니다
        # rowItem = self.listWidgetRight.takeItem(currentrowRight) # currentrowRight번째 항목을 삭제합니다
        itemsLeft = self.listWidgetLeft.selectedItems()
        for l in range(self.listWidgetLeft.count()):
            if self.listWidgetLeft.item(l).text() == currentitemRight.text():
                self.listWidgetLeft.item(l).setSelected(False)
                break
    def buttonAddAllClicked(self):
        itemsLeft = self.listWidgetLeft.selectAll()
        items = self.listWidgetLeft.selectedItems()
        for i in range(len(items)):
            self.listWidgetRight.addItem(items[i].text())
    def buttonRemoveAllClicked(self):
        for i in range(self.listWidgetRight.count()):
            # self.listWidgetLeft.addItem(self.listWidgetRight.takeItem(0))
            self.listWidgetRight.takeItem(0)
        self.listWidgetLeft.clearSelection()
    # def buttonUpClicked(self):
    #     rowIndex = self.listWidgetRight.currentRow()
    #     currentItem = self.listWidgetRight.takeItem(rowIndex)
    #     self.listWidgetRight.insertItem(rowIndex - 1, currentItem)
    #     self.listWidgetRight.setCurrentRow(rowIndex - 1)
    # def buttonDownClicked(self):
    #     rowIndex = self.listWidgetRight.currentRow()
    #     currentItem = self.listWidgetRight.takeItem(rowIndex)
    #     self.listWidgetRight.insertItem(rowIndex + 1, currentItem)
    #     self.listWidgetRight.setCurrentRow(rowIndex + 1)
    def updateButtonStatus(self):
        # self.buttons['Up'].setDisabled(not bool(self.listWidgetRight.selectedItems()) or self.listWidgetRight.currentRow() == 0)
        # self.buttons['Down'].setDisabled(not bool(self.listWidgetRight.selectedItems()) or self.listWidgetRight.currentRow() == self.listWidgetRight.count() - 1)
        self.buttons['>'].setDisabled(not bool(self.listWidgetLeft.selectedItems()) or self.listWidgetLeft.count() == 0)
        self.buttons['<'].setDisabled(not bool(self.listWidgetRight.selectedItems()) or self.listWidgetRight.count() == 0)
if __name__ == '__main__':
    # don't auto scale when drag app to a different monitor.
    # QApplication.setAttribute(Qt.HighDpiScaleFactorRoundingPolicy.PassThrough)
    app = QApplication(sys.argv)
    app.setStyleSheet('''
        QWidget {
            font-size: 30px;
        }
        QPushButton {
            color: white;
	        background-color: rgb(58, 134, 255);
	        border-radius: 5px;
        }
    ''')
    myApp = MyApp()
    myApp.show()
    try:
        sys.exit(app.exec_())
    except SystemExit:
        print('Closing Window...')

listwidgettolistwidget.py--------------------

import sys
# from PyQt5 import QtWidgets
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QListWidget, QGridLayout, \
                            QHBoxLayout, QVBoxLayout, QSizePolicy, QAbstractItemView
from PyQt5.QtCore import Qt
class MyApp(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("Moving Items Between List Widgets")
        self.window_width, self.window_height = 1200, 800
        self.setMinimumSize(self.window_width, self.window_height)
        self.layout = QHBoxLayout()
        self.setLayout(self.layout)
        self.initUI()
        str = "ABCDEFGHIJK"
        my_list = list(str)
        for i in enumerate(my_list):
            self.listWidgetLeft.addItem('Item {0}'.format(i[1]))
        # for i in range(10):
            # self.listWidgetLeft.addItem('Item {0}'.format(list("ABCDEFGHIJK")[i]))
        self.updateButtonStatus()
        self.setButtonConnections()
    def initUI(self):
        subLayouts = {}
        subLayouts['LeftColumn'] = QGridLayout()
        subLayouts['RightColumn'] = QVBoxLayout()
        self.layout.addLayout(subLayouts['LeftColumn'], 1)
        self.layout.addLayout(subLayouts['RightColumn'], 1)
        self.buttons = {}
        self.buttons['>>'] = QPushButton('&>>')
        self.buttons['>>'].setStyleSheet(
                    "color: white;"
	                "background-color: rgb(58, 134, 255);"
	                "border-radius: 5px;"
        )
        self.buttons['>'] = QPushButton('>')
        self.buttons['>'].setStyleSheet(
                    "color: white;"
	                "background-color: rgb(58, 134, 255);"
	                "border-radius: 5px;"
        )
        self.buttons['<'] = QPushButton('<')
        self.buttons['<'].setStyleSheet(
                    "color: white;"
	                "background-color: rgb(58, 134, 255);"
	                "border-radius: 5px;"
        )
        self.buttons['<<'] = QPushButton('&<<')
        # self.buttons['<<'].setStyleSheet(
        #             "color: white;"
	    #             "background-color: rgb(58, 134, 255);"
	    #             "border-radius: 5px;"
        # )
        # self.buttons['Up'] = QPushButton('&Up')
        # self.buttons['Up'].setStyleSheet(
        #             "color: white;"
	    #             "background-color: rgb(58, 134, 255);"
	    #             "border-radius: 5px;"
        # )
        # self.buttons['Down'] = QPushButton('&Down')
        # self.buttons['Down'].setStyleSheet(
        #             "color: white;"
	    #             "background-color: rgb(58, 134, 255);"
	    #             "border-radius: 5px;"
        # )
        for k in self.buttons:
            self.buttons[k].setSizePolicy(QSizePolicy.Minimum, QSizePolicy.Fixed)
        """
        First Column
        """
        self.listWidgetLeft = QListWidget()
        # self.listWidgetLeft.setSelectionMode(2) # 여러행 선택
        self.listWidgetLeft.setSelectionMode(QAbstractItemView.MultiSelection)
        subLayouts['LeftColumn'].addWidget(self.listWidgetLeft, 1, 0, 4, 4)
        subLayouts['LeftColumn'].setRowStretch(4, 1)
        subLayouts['LeftColumn'].addWidget(self.buttons['>>'], 1, 4, 1, 1, alignment=Qt.AlignTop)
        subLayouts['LeftColumn'].addWidget(self.buttons['<'], 2, 4, 1, 1, alignment=Qt.AlignTop)
        subLayouts['LeftColumn'].addWidget(self.buttons['>'], 3, 4, 1, 1, alignment=Qt.AlignTop)
        subLayouts['LeftColumn'].addWidget(self.buttons['<<'], 4, 4, 1, 1, alignment=Qt.AlignTop)
        """
        Second Column
        """
        self.listWidgetRight = QListWidget()
        hLayout = QHBoxLayout()
        subLayouts['RightColumn'].addLayout(hLayout)
        hLayout.addWidget(self.listWidgetRight, 4)
        # vLayout = QVBoxLayout()
        # hLayout.addLayout(vLayout, 1)
        # vLayout.addWidget(self.buttons['Up'])
        # vLayout.addWidget(self.buttons['Down'])
        # vLayout.addStretch(1)
    def setButtonConnections(self):
        self.listWidgetLeft.itemSelectionChanged.connect(self.updateButtonStatus)
        self.listWidgetRight.itemSelectionChanged.connect(self.updateButtonStatus)
        self.buttons['>'].clicked.connect(self.buttonAddClicked)
        self.buttons['<'].clicked.connect(self.buttonRemoveClicked)
        self.buttons['>>'].clicked.connect(self.buttonAddAllClicked)
        self.buttons['<<'].clicked.connect(self.buttonRemoveAllClicked)
        # self.buttons['Up'].clicked.connect(self.buttonUpClicked)
        # self.buttons['Down'].clicked.connect(self.buttonDownClicked)
    def buttonAddClicked(self):
        itemsLeft = self.listWidgetLeft.selectedItems()
        itemsRight =  [str(self.listWidgetRight.item(i).text()) for i in range(self.listWidgetRight.count())]
        if len(itemsRight)==0:
            for i in range(len(itemsLeft)):
                    self.listWidgetRight.addItem(itemsLeft[i].text())
        else:
            for i in range(len(itemsLeft)):
                samecount = 0
                for j in range(len(itemsRight)):
                    if itemsLeft[i].text() == itemsRight[j]:
                        samecount += 1
                        break
                if samecount == 0:
                    self.listWidgetRight.addItem(itemsLeft[i].text())
        self.listWidgetRight.setSortingEnabled(True)
    def buttonRemoveClicked(self):
        currentitemRight = self.listWidgetRight.currentItem()
        currentrowRight = self.listWidgetRight.currentRow()
        self.listWidgetRight.takeItem(currentrowRight) # currentrowRight번째 항목을 삭제합니다
        # rowItem = self.listWidgetRight.takeItem(currentrowRight) # currentrowRight번째 항목을 삭제합니다
        itemsLeft = self.listWidgetLeft.selectedItems()
        for l in range(self.listWidgetLeft.count()):
            if self.listWidgetLeft.item(l).text() == currentitemRight.text():
                self.listWidgetLeft.item(l).setSelected(False)
                break
    def buttonAddAllClicked(self):
        itemsLeft = self.listWidgetLeft.selectAll()
        items = self.listWidgetLeft.selectedItems()
        for i in range(len(items)):
            self.listWidgetRight.addItem(items[i].text())
    def buttonRemoveAllClicked(self):
        for i in range(self.listWidgetRight.count()):
            # self.listWidgetLeft.addItem(self.listWidgetRight.takeItem(0))
            self.listWidgetRight.takeItem(0)
        self.listWidgetLeft.clearSelection()
    # def buttonUpClicked(self):
    #     rowIndex = self.listWidgetRight.currentRow()
    #     currentItem = self.listWidgetRight.takeItem(rowIndex)
    #     self.listWidgetRight.insertItem(rowIndex - 1, currentItem)
    #     self.listWidgetRight.setCurrentRow(rowIndex - 1)
    # def buttonDownClicked(self):
    #     rowIndex = self.listWidgetRight.currentRow()
    #     currentItem = self.listWidgetRight.takeItem(rowIndex)
    #     self.listWidgetRight.insertItem(rowIndex + 1, currentItem)
    #     self.listWidgetRight.setCurrentRow(rowIndex + 1)
    def updateButtonStatus(self):
        # self.buttons['Up'].setDisabled(not bool(self.listWidgetRight.selectedItems()) or self.listWidgetRight.currentRow() == 0)
        # self.buttons['Down'].setDisabled(not bool(self.listWidgetRight.selectedItems()) or self.listWidgetRight.currentRow() == self.listWidgetRight.count() - 1)
        self.buttons['>'].setDisabled(not bool(self.listWidgetLeft.selectedItems()) or self.listWidgetLeft.count() == 0)
        self.buttons['<'].setDisabled(not bool(self.listWidgetRight.selectedItems()) or self.listWidgetRight.count() == 0)
if __name__ == '__main__':
    # don't auto scale when drag app to a different monitor.
    # QApplication.setAttribute(Qt.HighDpiScaleFactorRoundingPolicy.PassThrough)
    app = QApplication(sys.argv)
    app.setStyleSheet('''
        QWidget {
            font-size: 30px;
        }
        QPushButton {
            color: white;
	        background-color: rgb(58, 134, 255);
	        border-radius: 5px;
        }
    ''')
    myApp = MyApp()
    myApp.show()
    try:
        sys.exit(app.exec_())
    except SystemExit:
        print('Closing Window...')