Python/QT

[python QT] 리스트 위젯 사용하기

언제나휴일 2020. 11. 19. 14:22
반응형

안녕하세요. 언제나휴일입니다.

이번에는 리스트 위젯을 사용하는 실습을 해 볼게요.

1. 초기화면
2. 항목 추가한 후
3. 항목 선택 후
4. 항목 삭제 후
5. 항목 Clear 후

1. 소스 코드

#MainWindow.py
import PyQt5.QtWidgets as qtwid
class MainWindow(qtwid.QMainWindow):
    def __init__(self):
        super().__init__()
        self.te_item = qtwid.QTextEdit(self)
        self.btn_add = qtwid.QPushButton("추가",self)        
        self.lbox_item = qtwid.QListWidget(self)
        self.lb_item = qtwid.QLabel("[선택 항목]",self)
        self.btn_remove = qtwid.QPushButton("삭제",self)
        self.btn_clear = qtwid.QPushButton("Clear",self)
        self.Initialize()
    def Initialize(self):
        self.setWindowTitle("리스트 위젯 사용하기")
        self.resize(460,400)
        self.te_item.move(20,20)
        self.te_item.resize(300,40)
        self.btn_add.move(340,20)
        self.btn_add.resize(100,40)
        self.lbox_item.move(20,80)
        self.lbox_item.resize(300,300)   
        self.lb_item.move(340,80)
        self.lb_item.resize(200,40)
        self.btn_remove.move(340,140)
        self.btn_remove.resize(100,40)
        self.btn_remove.setEnabled(False)
        self.btn_clear.move(340,200)
        self.btn_clear.resize(100,40)
        self.btn_add.clicked.connect(self.Btn_addClick)        
        self.lbox_item.itemSelectionChanged.connect(self.Lbox_itemSelectionChange)
        self.btn_remove.clicked.connect(self.Btn_removeClick)
        self.btn_clear.clicked.connect(self.Btn_clearClick)
    def Btn_addClick(self):
        query = self.te_item.toPlainText()
        self.te_item.setText("")
        self.lbox_item.addItem(query)
    def Lbox_itemSelectionChange(self):        
        item = self.lbox_item.currentItem()
        if(item == None):
            self.lb_item.setText("[선택 항목]")
            self.btn_remove.setEnabled(False)
        else:
            self.lb_item.setText(item.text())
            self.btn_remove.setEnabled(True)

    def Btn_removeClick(self):
        rn = self.lbox_item.currentRow()
        self.lbox_item.takeItem(rn)
    def Btn_clearClick(self):
        self.lbox_item.clear()
        self.Lbox_itemSelectionChange()
#리스트 위젯 사용하기
#Main.py
import sys
import PyQt5.QtWidgets as qtwid
from MainWindow import MainWindow

app = qtwid.QApplication(sys.argv)
mw = MainWindow()
mw.show()
app.exec_()

2. MainWindow 클래스

QT 위젯을 사용하기 위해 모듈을 import합니다.

#MainWindow.py
import PyQt5.QtWidgets as qtwid

MainWIndow 클래스는 QMainWindow를 기반으로 파생 클래스로 정의합니다.

class MainWindow(qtwid.QMainWindow):

2.1 __init__ 메서드

생성자에서는 기반 형식 초기화를 수행합니다.

    def __init__(self):
        super().__init__()

항목을 추가하기 위한 QTextEdit, 추가 PushButton, 항목을 보여줄 QListWidget, 선택 항목을 보여줄 QLabel, 삭제 및 Clear에 사용할 PushButton을 생성합니다.

        self.te_item = qtwid.QTextEdit(self)
        self.btn_add = qtwid.QPushButton("추가",self)        
        self.lbox_item = qtwid.QListWidget(self)
        self.lb_item = qtwid.QLabel("[선택 항목]",self)
        self.btn_remove = qtwid.QPushButton("삭제",self)
        self.btn_clear = qtwid.QPushButton("Clear",self)

자식 위젯을 배치하고 이벤트 핸들러 지정 등은 Initialize 메서드를 만들어서 수행합시다. 이를 호출합니다.

        self.Initialize()

2.2 Initailize 메서드

윈도우 타이틀과 크기를 조절합니다.

    def Initialize(self):
        self.setWindowTitle("리스트 위젯 사용하기")
        self.resize(460,400)

자식 위젯들의 위치와 크기를 조절합니다. *삭제 버튼은 비활성화 상태로 지정할게요.*

        self.te_item.move(20,20)
        self.te_item.resize(300,40)
        self.btn_add.move(340,20)
        self.btn_add.resize(100,40)
        self.lbox_item.move(20,80)
        self.lbox_item.resize(300,300)   
        self.lb_item.move(340,80)
        self.lb_item.resize(200,40)
        self.btn_remove.move(340,140)
        self.btn_remove.resize(100,40)
        self.btn_remove.setEnabled(False)
        self.btn_clear.move(340,200)
        self.btn_clear.resize(100,40)

추가 버튼의 클릭 이벤트 핸들러를 등록합니다.

항목 리스트 위젯의 선택 항목 변경 이벤트 핸들러를 등록합니다.

삭제 버튼과 Clear 버튼의 클릭 이벤트 핸들러를 등록합시다.

        self.btn_add.clicked.connect(self.Btn_addClick)        
        self.lbox_item.itemSelectionChanged.connect(self.Lbox_itemSelectionChange)
        self.btn_remove.clicked.connect(self.Btn_removeClick)
        self.btn_clear.clicked.connect(self.Btn_clearClick)

2.3 Btn_addClick 메서드

추가할 항목을 입력한 te_item(QTextEdit) 내용을 얻어옵니다.

    def Btn_addClick(self):
        query = self.te_item.toPlainText()

te_item의 텍스트를 빈 문자열로 설정합니다.

        self.te_item.setText("")

항목 리스트 위젯(lbox_item)에 얻어온 문자열을 항목 추가합니다.

        self.lbox_item.addItem(query)

2.4 Lbox_itemSelectionChange  메서드 

현재 항목을 얻어옵니다.

    def Lbox_itemSelectionChange(self):        
        item = self.lbox_item.currentItem()

현재 항목이 없다면 선택 항목 Label의 텍스트 속성을 지워주고 삭제 버튼을 비활성화 시킵니다.

        if(item == None):
            self.lb_item.setText("[선택 항목]")
            self.btn_remove.setEnabled(False)

항목이 있다면 선택 항목 Label의 텍스트 속성을 항목의 텍스트로 설정합니다. 삭제 버튼은 활성화 시킵니다.

        else:
            self.lb_item.setText(item.text())
            self.btn_remove.setEnabled(True)

2.5 Btn_removeClick 메서드

현재 선택 항목의 Row값을 얻어옵니다.

    def Btn_removeClick(self):
        rn = self.lbox_item.currentRow()

항목 리스트 박스에서 삭제합니다.

        self.lbox_item.takeItem(rn)

2.6 Btn_clearClick 메서드

항목 리스트 위젯을 Clear 시킵니다.

    def Btn_clearClick(self):
        self.lbox_item.clear()

항목 변경 이벤트 핸들러(Lbox_itemSelectionChange)를 호출합니다.

        self.Lbox_itemSelectionChange()

 

Main.py는 이전 실습과 차이가 없어서 설명을 생략합니다.

이상으로 리스트 위젯을 사용하는 프로그램 실습을 마칠게요.

반응형