개발 이슈,해결법

PyQt5 QComboBox 예제 (행정구역 선택에 따른 하위 행정구역 선택)

난쏘공돌이 2021. 7. 30. 18:43

제목이 좀 혼란스러울수도 있을것 같습니다

보여드리고자 하는 바를 사진으로 보일 필요성이 있겠네요

이런 창은 많이 보셨을 겁니다. 큰 행정구역을 선택하면 그 하위 행정구역을 콤보박스를 통해 선택할수 있는거죠.

 

이러한 방식은 백신예약이나 회원가입등등 많은 분야에 사용이 되어지고 있는데요.

막상 이러한 방식을 구현하려고 하니 인터넷상에는 단순히 콤보박스를 사용하는 것에서 끝나는 예제만 있고

두개의 콤보박스를 유기적으로 제어하는 방법은 없더라구요.

 

그래서! 제가 프로젝트를 진행하면서 깨달은 방법을 공유합니다 ㅎㅎ

 

일단 간단하게 .ui 파일을 만들겠습니다

첫번째 콤보박스는 comboBox 두번째는 comboBox_2

그리고 예제코드를 보여드릴게요.

 

# -*- coding: utf-8 -*-
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5 import uic
import os
import sys

seoul_list = ['강남구','강동구', '강북구' , '강서구' ,'관악구','광진구' , '구로구', '금천구' , '노원구', '도봉구', '동대문구', '동작구', '마포구' , '서대문구' , '서초구', '성동구', '성북구', '송파구' , '양천구' , '영등포구' , '용산구' , '은평구' , '종로구' , '중구' , '중랑구']

gyeongki_list = ['가평군' ,'고양시 덕양구' ,'고양시 일산동구','고양시 일산서구' ,'과천시' ,'광명시' ,'광주시' ,'구리시' ,'군포시' ,'김포시' ,'남양주시' ,'동두천시' ,'부천시' ,'성남시 분당구' ,'성남시 수정구' ,'성남시 중원구' ,'수원시 권선구' ,'수원시 영통구' ,'수원시 장안구', '수원시 팔달구' ,'시흥시' ,'안산시 단원구' ,'안산시 상록구' ,'안성시', '안양시 동안구' ,'안양시 만안구' ,'양주시' ,'양평군' ,'여주시', '연천군' ,'오산시',' 용인시 기흥구' ,'용인시 수지구', '용인시 처인구' ,'의왕시', '의정부시' ,'이천시' ,'파주시' ,'평택시' ,'포천시', '하남시' ,'화성시']


#UI파일 연결
#단, UI파일은 Python 코드 파일과 같은 디렉토리에 위치해야한다.
form_class = uic.loadUiType(os.path.abspath("untitled.ui"))[0]

class WindowClass(QMainWindow, form_class) :
    def __init__(self) :
        super().__init__()
        self.setupUi(self)

        self.comboBox.addItem('경기')
        self.comboBox.addItem('서울')
        self.comboBox.addItem('인천')
        # 선택되면 두번째 콤보박스의 내용이 바뀜
        self.comboBox.activated[str].connect(lambda :self.selectedComboItem(self.comboBox))
        
        self.comboBox_2.addItem('이전구역을 먼저 선택해주세요')
 
        self.show()

        

    ### 콤보박스 관련 함수
    def selectedComboItem(self,text):
    
        print(text.currentText())
        if text.currentText() == '서울':
            print("1")

            self.comboBox_2.clear()
            self.comboBox_2.addItems(seoul_list)

        if text.currentText() == '경기':
            print("1")

            self.comboBox_2.clear()
            self.comboBox_2.addItems(gyeongki_list)




if __name__ == "__main__" :
    #QApplication : 프로그램을 실행시켜주는 클래스
    app = QApplication(sys.argv) 
    
    #WindowClass의 인스턴스 생성
    myWindow = WindowClass() 

    #프로그램 화면을 보여주는 코드
    myWindow.show()

    #프로그램을 이벤트루프로 진입시키는(프로그램을 작동시키는) 코드
    app.exec_()

QcomboBox의 메소드들을 확실하게 알고계셔야 이해하기가 쉬울겁니다

QcomboBox메소드

https://doc.qt.io/qtforpython-5/PySide2/QtWidgets/QComboBox.html

 

QComboBox — Qt for Python

QComboBox The QComboBox widget is a combined button and popup list. More… Inherited by: QFontComboBox Synopsis Functions def addItem (icon, text[, userData=None]) def addItem (text[, userData=None]) def addItems (texts) def autoCompletion () def autoComp

doc.qt.io

이게 바로 공식 레퍼런스 문서구요

 

위에서 사용한 메소드는

 

  • def addItem (icon, text[, userData=None]) : 콤보박스의 요소를 추가함
  • (위의 코드와 같이 리스트 형태로 집어넣어도 됩니다)
  • def addItem (text[, userData=None])
  • def addItems (texts)

 

  • def clear () : 해당 콤보박스의 전체내용을 삭제함.

 

  • def activated (arg__1) : 콤보박스의 어느 한 요소가 선택되었을때의 시그널
  • def activated (index)

좀 감이 오실까요 단순하게 이전 콤보박스가 선택되면, 그 콤보박스의 내용(문자열)을 검사해서

두번째 콤보박스의 내용을 clear() 해준다음 새로운 지역리스트를 addItem() 해주는 방식입니다!

 

쉬운예제이지만 인터넷상에서 이런 질문을 봐서 같이 한번 공유해봅니다!

 

결과입니다!