본문으로 바로가기
반응형
#!/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_())

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

 

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

https://spec.tistory.com/434

 

다음은 어떻게 구현을 했는지 간략하게 소스를 설명하도록 하겠습니다. 먼저 화면에 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_())
반응형