본문으로 바로가기
반응형

QInputDialog 는 사용자로부터 데이터를 입력받는 형태의 다이얼로그로 다섯 종류의 입력 형태를 제공합니다. 각 함수별로 입력 받을 수 있는 데이터 종류는 다릅니다. 크게 문자열, 숫자, 사용자 선택 으로 구분할 수 있습니다.

 

  • getText() : 일반 한 줄 텍스트 입력받을 수 있는 대화상자
  • getMultiLineText() : 여러 줄의 텍스트를 입력받을 수 있는 대화상자
  • getInt() : 숫자를 입력받을 수 있는 대화상자
  • getDouble() : 소수점이 가능한 실수를 입력받을 수 있는 대화상자
  • getItem() : 사용자가 정의한 데이터 중 하나를 선택할 수 있는 대화상자

 

QInputDialog 다이얼로그에서 입력받은 데이터를 표현할 라벨을 추가합니다. 라벨의 초기 배경색이 하얀색이라 화면에 잘 안보여서 setStyleSheet() 함수를 사용해서 색상을 변경했습니다.

from PyQt5.QtWidgets import QLabel

#  QInputDialog 로 부터 입력받은 데이터를 표시할 라벨
self.label = QLabel(self)
self.label.setStyleSheet('background-color : green')
self.label.setGeometry(10, 10, 200, 30)

 

먼저 5가지 형태의 QInputDialog 를 띄우기 위한 버튼을 모두 만듭니다. 각 버튼의 clicked 시그널 마다 기능을 수행할 함수를 연결합니다.

from PyQt5.QtWidgets import QPushButton

# getText() 함수 사용
self.pb_text = QPushButton('getText() dialog', self)
self.pb_text.clicked.connect(self.text_dialog)
self.pb_text.setGeometry(10, 50, 200, 30)

# getMultiLineText() 로 멀티라인 입력창 띄우기
self.pb_multilinetext = QPushButton('getMultiLineText() dialog', self)
self.pb_multilinetext.clicked.connect(self.multilinetext_dialog)
self.pb_multilinetext.setGeometry(10, 90, 200, 30)

# getInt() 로 숫자 입력창 띄우기
self.pb_int = QPushButton('getInt() dialog', self)
self.pb_int.clicked.connect(self.int_dialog)
self.pb_int.setGeometry(10, 130, 200, 30)

# getDouble() 로 소수점이 가능한 실수 입력창 띄우기
self.pb_double = QPushButton('getDouble() dialog', self)
self.pb_double.clicked.connect(self.double_dialog)
self.pb_double.setGeometry(10, 170, 200, 30)

# getItem() 로 콤보박스 선택창 띄우기
self.pb_item = QPushButton('getItem() dialog', self)
self.pb_item.clicked.connect(self.item_dialog)
self.pb_item.setGeometry(10, 210, 200, 30)

 

화면 구성은 다음과 같습니다. 제일 상단에 각 다이얼로그 박스에서 입력한 값을 표시하는 QLabel 위젯이 위치합니다.

 

이제 각 버튼에 연결된 함수들에 대해 설명하겠습니다. 5가지 QInputDialog 의 입력 형태 중 텍스트를 입력받는 대화상자를 띄우는 함수는 text_dialog() 입니다. QInputDialog static 함수인 getText() 을 사용합니다. 대화상자를 띄우고 사용자가 OK 를 눌렀는지 판단합니다. 그리고 반환받은 값을 QLabel 객체의 setText() 함수를 이용해서 화면에 표시합니다.

from PyQt5.QtWidgets import QInputDialog

@pyqtSlot()
def text_dialog(self):
    text, ok = QInputDialog.getText(self, 'Input Dialog', 'Text Input')
    if ok:
        self.label.setText(text)

 

두 번째는 여러 줄의 데이터를 입력받을 수 있는 다이얼로그창입니다. static 함수인 getMultiLineText() 을 이용합니다. 파라미터로 대화상자의 타이틀과 입력박스위에 표시할 텍스트가 넘겨야 합니다.

from PyQt5.QtWidgets import QInputDialog

@pyqtSlot()
def multilinetext_dialog(self):
    text, ok = QInputDialog.getMultiLineText(self, 'Input Dialog', 'MultiLineText Input')
    if ok:
        self.label.setText(text)

 

세 번째는 숫자를 입력받을 수 있는 다이얼로그창입니다. static 함수인 getInt() 을 사용합니다. 파라미터는 getText() 와 동일합니다. QInputDialog 로 넘겨받은 값은 숫자인 int 이므로 반드시 QLabel 에 표시하기 위해서는 문자열로 캐스팅을 해야 합니다. 캐스팅 함수는 str() 입니다.

from PyQt5.QtWidgets import QInputDialog

@pyqtSlot()
def int_dialog(self):
    int_data, ok = QInputDialog.getInt(self, 'Input Dialog', 'MultiLineText Input')
    if ok:
        self.label.setText(str(int_data))

 

네 번째는 숫자값을 입력받는 getInt() 와 유사한 getDouble() 입니다. 두 함수로 띄우는 다이얼로그의 차이는 getDouble() 가 소수점 입력이 가능하다는 것입니다. 리턴받은 값은 str() 함수를 사용해서 문자열로 변경한 후 QLable 에 표시합니다.

from PyQt5.QtWidgets import QInputDialog

@pyqtSlot()
def double_dialog(self):
    double_data, ok = QInputDialog.getDouble(
        self, 'Input Dialog', 'MultiLineText Input')

    if ok:
        self.label.setText(str(double_data))

 

다섯 번째는 목록에서 값을 선택할 수 있는 콤보박스 다이얼로그입니다. 위에서 설명한 다른 다이얼로그와 달리 파라미터가 하나 더 필요합니다. 목록을 구성할 리스트 객체를 생성해서 넘겨야 합니다. items 객체가 바로 그것입니다. 그림처럼 사용자가 넘긴 목록이 다이얼로그 콤보 박스에 들어갔습니다. 사용자가 콤보박스에서 데이터를 선택하고 OK 버튼을 누르면 해당 값을 반환합니다. 다이얼로그에서 반환한 값을 QLabel 에 표시합니다.

from PyQt5.QtWidgets import QInputDialog

@pyqtSlot()
def item_dialog(self):
    items = {'aa', 'bb', 'cc', 'dd'}
    item_data, ok = QInputDialog.getItem(
        self, 'Input Dialog', 'MultiLineText Input', items)

    if ok:
        self.label.setText(item_data)

 

전체 소스는 다음과 같습니다.

#!/usr/bin/env python3
import sys
from PyQt5.QtWidgets import QMainWindow, \
    QPushButton, QApplication, QInputDialog, QLabel
from PyQt5.QtCore import pyqtSlot


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

        #  QInputDialog 로 부터 입력받은 데이터를 표시할 라벨
        self.label = QLabel(self)
        self.label.setStyleSheet('background-color : green')
        self.label.setGeometry(10, 10, 200, 30)

        # getText() 로 텍스트 입력창 띄우기
        self.pb_text = QPushButton('getText() dialog', self)
        self.pb_text.clicked.connect(self.text_dialog)
        self.pb_text.setGeometry(10, 50, 200, 30)

        # getMultiLineText() 로 멀티라인 입력창 띄우기
        self.pb_multilinetext = QPushButton('getMultiLineText() dialog', self)
        self.pb_multilinetext.clicked.connect(self.multilinetext_dialog)
        self.pb_multilinetext.setGeometry(10, 90, 200, 30)

        # getInt() 로 숫자 입력창 띄우기
        self.pb_int = QPushButton('getInt() dialog', self)
        self.pb_int.clicked.connect(self.int_dialog)
        self.pb_int.setGeometry(10, 130, 200, 30)

        # getDouble() 로 소수점이 가능한 실수 입력창 띄우기
        self.pb_double = QPushButton('getDouble() dialog', self)
        self.pb_double.clicked.connect(self.double_dialog)
        self.pb_double.setGeometry(10, 170, 200, 30)

        # getItem() 로 콤보박스 선택창 띄우기
        self.pb_item = QPushButton('getItem() dialog', self)
        self.pb_item.clicked.connect(self.item_dialog)
        self.pb_item.setGeometry(10, 210, 200, 30)

    @pyqtSlot()
    def text_dialog(self):
        text, ok = QInputDialog.getText(self, 'Input Dialog', 'Text Input')
        if ok:
            self.label.setText(text)

    @pyqtSlot()
    def multilinetext_dialog(self):
        text, ok = QInputDialog.getMultiLineText(self, 'Input Dialog', 'MultiLineText Input')
        if ok:
            self.label.setText(text)

    @pyqtSlot()
    def int_dialog(self):
        int_data, ok = QInputDialog.getInt(self, 'Input Dialog', 'MultiLineText Input')
        if ok:
            self.label.setText(str(int_data))

    @pyqtSlot()
    def double_dialog(self):
        double_data, ok = QInputDialog.getDouble(
            self, 'Input Dialog', 'MultiLineText Input')

        if ok:
            self.label.setText(str(double_data))

    @pyqtSlot()
    def item_dialog(self):
        items = {'aa', 'bb', 'cc', 'dd'}
        item_data, ok = QInputDialog.getItem(
            self, 'Input Dialog', 'MultiLineText Input', items)

        if ok:
            self.label.setText(item_data)


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