Please Enable JavaScript!
Gon[ Enable JavaScript ]

파이썬(Python) PyQt5 QListWidget 고급, 데이터 옮기기

파이썬 Python
반응형

QListWidget 위젯을 사용해서 구현할 내용은 아래와 같습니다. 중앙에 버튼을 눌러 왼쪽 목록에 있는 항목을 오른쪽으로 옮기고 지우는 것입니다. 반대의 경우도 마찬가지입니다. 바로 아래 버튼을 누르면 오른쪽에서 왼쪽으로 데이터가 이동합니다. QListWidget 의 기본 사용법을 응용해서 만든 것입니다.

 

 

QListWidget 의 기초 사용법은 아래 포스팅을 참고하세요.

https://mainia.tistory.com/7196 

 

파이썬(Python) PyQt5 QListWidget 위젯 사용하기

QListWidget 은 화면에 목록을 보여주고 싶을 때 사용하는 위젯입니다. QListWidgetItem 을 내부 모델 객체로 사용해서 관리합니다. QListView 와 비교해서는 좀더 유연한 화면을 구현할 수 있습니다. 리스

mainia.tistory.com

 


 

 

다음은 어떻게 구현을 했는지 간략하게 소스를 설명하도록 하겠습니다. 먼저 화면에 QListWidget 2개를 추가합니다. 한쪽은 데이터를 채우고 다른 한쪽은 비웁니다. 

from PyQt5.QtWidgets import QListWidget

# 첫 번째 QListWidget 추가
self.listwidget1 = QListWidget(self)
self.listwidget1.setGeometry(10, 10, 150, 100)

# 지정한 행 위치에 값 추가
self.listwidget1.insertItem(0, "Chrome")
self.listwidget1.insertItem(1, "Explorer")
self.listwidget1.insertItem(2, "Firefox")
self.listwidget1.insertItem(4, "Edge")

# 두 번째 QListWidget 추가
self.listwidget2 = QListWidget(self)
self.listwidget2.setGeometry(300, 10, 150, 100)

 

화면 구성 요소 중 2번째에 해당하는 좌우 이동 버튼 두개로 추가합니다. 그리고 각 버튼의 clicked 시그널에 함수를 연결합니다. 함수에는 데이터를 옮기는 로직이 들어갑니다. 

from PyQt5.QtWidgets import QPushButton

# --- 오른쪽 옮기기
self.left_button = QPushButton(self);
self.left_button.move(180, 20)
self.left_button.setText('-->')

# --- 왼쪽 옮기기
self.right_button = QPushButton(self)
self.right_button.move(180, 60)
self.right_button.setText('<--')

# 데이터 옮기기 버튼 이벤트
self.left_button.clicked.connect(self.clicked_left_button)
self.right_button.clicked.connect(self.clicked_right_button)

 

두 개의 QPushButton 과 연결된 함수는 다음과 같습니다. 실제 데이터를 옮기는데 사용하는 함수는 move_current_item() 입니다. clicked 시그널과 연결된 두 함수는 데이터를 옮길 곳의 소스와 타겟을 파라미터로 구분해서 move_current_item() 을 실행합니다move_current_item() 내부에서는 소스에 해당하는 QListWidget 의 선택되어 있는 행 번호를 currentRow() 로 알아옵니다. 리턴 받은 행 번호를 taskItem() 함수의 파라미터로 넘겨서 현재 선택된 QListWidgetItem 객체를 가져와 타겟에 해당하는 QListWidget addItem() 을 이용해서 추가합니다. 

def clicked_left_button(self):
    self.move_current_item(self.listwidget1, self.listwidget2)

def clicked_right_button(self):
    self.move_current_item(self.listwidget2, self.listwidget1)

def move_current_item(self, src, dst):
    if src.currentItem():
        row = src.currentRow()
        dst.addItem(src.takeItem(row))

 

지금까지 설명한 내용을 구현한 전체 소스는 다음과 같습니다. 

#!/usr/bin/env python3
import sys
from PyQt5.QtWidgets import QApplication, QListWidget, \
    QMainWindow, QPushButton


class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        # 윈도우 설정
        self.setGeometry(300, 300, 500, 300)  # x, y, w, h
        self.setWindowTitle('Two QListWidget Window')

        # 첫 번째 QListWidget 추가
        self.listwidget1 = QListWidget(self)
        self.listwidget1.setGeometry(10, 10, 150, 100)

        # 지정한 행 위치에 값 추가
        self.listwidget1.insertItem(0, "Chrome")
        self.listwidget1.insertItem(1, "Explorer")
        self.listwidget1.insertItem(2, "Firefox")
        self.listwidget1.insertItem(4, "Edge")

        # 두 번째 QListWidget 추가
        self.listwidget2 = QListWidget(self)
        self.listwidget2.setGeometry(300, 10, 150, 100)

        # --- 오른쪽 옮기기
        self.left_button = QPushButton(self);
        self.left_button.move(180, 20)
        self.left_button.setText('-->')

        # --- 왼쪽 옮기기
        self.right_button = QPushButton(self)
        self.right_button.move(180, 60)
        self.right_button.setText('<--')

        # 데이터 옮기기 버튼 이벤트
        self.left_button.clicked.connect(self.clicked_left_button)
        self.right_button.clicked.connect(self.clicked_right_button)

    def clicked_left_button(self):
        self.move_current_item(self.listwidget1, self.listwidget2)

    def clicked_right_button(self):
        self.move_current_item(self.listwidget2, self.listwidget1)

    def move_current_item(self, src, dst):
        if src.currentItem():
            row = src.currentRow()
            dst.addItem(src.takeItem(row))

if __name__ == '__main__':
    app = QApplication(sys.argv)
    mainWindow = MainWindow()
    mainWindow.show()
    sys.exit(app.exec_())

 

반응형
Posted by 녹두장군1
,