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_())
'파이썬 Python' 카테고리의 다른 글
파이썬(Python) OpenCV 파일 읽기와 저장하기 (1) | 2024.08.28 |
---|---|
파이썬 Python Flask no module named xxxx 에러 해결하기 (0) | 2024.08.25 |
파이썬(Python) Flask 이미지 서버에 올리기 (0) | 2024.08.25 |
파이썬(Python) 설치 라이브러리 확인하기 (0) | 2024.08.24 |
파이썬(Python) PyQt5 QListWidget 위젯 사용하기 (0) | 2024.08.22 |
파이썬(Python) str.format 문자열 형식화 하기 (0) | 2024.08.17 |
파이썬(Python) Pyinstaller 로 exe 실행 파일 만드는 방법 (5) | 2024.08.02 |
파이썬(Python) 문자를 숫자로 변환해서 숫자에 더하는 방법 (0) | 2024.07.21 |
녹두장군1님의
글이 좋았다면 응원을 보내주세요!