Profile picture

[Python / GUI] PySide6: QDateEdit 위젯 활용 및 날짜 검증

JaehyoJJAng2024년 08월 16일

개요

PySide6Qt Designer 를 사용하여 날짜 입력 프로그램을 구현하는 방법을 기록해보려고 한다.

특히 QDateEdit 위젯을 활용해 연도-월-일(YYYY-MM-DD) 형식의 날짜를 입력 받고,

기본 날짜 설정과 날짜 검증까지 구현해보겠다.


1. Qt Designer에서 UI 설계

  • Qt Designer를 사용하여 GUI를 설계해보자.

1. Qt Designer를 실행하고 왼쪽 위젯 패널에 QDateEdit 위젯 두개 추가
image


2. 위젯 속성 설정

  • QDateEdit 위젯을 선택하고, 오른쪽 속성 패널에서 objectName을 각각 startDate, endDate로 설정
  • UI 파일 저장: 디자인한 폼을 main.ui와 같은 이름으로 저장

2. 기본 날짜 설정하기

코드에서 DateEdit 위젯의 기본 날짜를 선택해보자.

  • 시작 날짜 (startDate): 현재 날짜에서 한 달 전 날짜 로 설정
  • 종료 날짜 (endDate): 현재 날짜 로 설정
from PySide6.QtWidgets import QApplication, QMainWindow, QDateEdit
from PySide6.QtCore import QDate
from main_ui import Ui_Form
import sys

class MainWindow(QMainWindow, Ui_Form):
    def __init__(self):
        super().__init__()
        self.setupUi(self)

        # 기본 날짜 설정
        self.startDate.setDate(QDate.currentDate().addMonths(-1))  # 한 달 전 날짜
        self.endDate.setDate(QDate.currentDate())  # 현재 날짜

3. 날짜 검증 기능 구현

image


사용자가 입력한 날짜가 유효한지 검증하고, 시작 날짜와 종료 날짜의 차이가 최대 1년(365)일 을 넘지 않도록 함.

from PySide6.QtWidgets import QMessageBox
    # 클래스 내에 함수 추가
    def validate_dates(self) -> bool:
        # QDate 객체로 날짜 가져오기
        start_date = self.startDate.date()
        end_date = self.endDate.date()

        # 날짜 차이 계산
        days_difference = start_date.daysTo(end_date)

        # 날짜 검증
        if days_difference > 365:
            QMessageBox.warning(self, "날짜 오류", "최대 1년까지 설정 가능합니다.")
            return False
        elif days_difference < 0:
            QMessageBox.warning(self, "날짜 오류", "종료 날짜는 시작 날짜 이후여야 합니다.")
            return False
        else:
            return True
  • 날짜 차이 계산: start_date.daysTo(end_date)를 사용하여 두 날짜 사이의 일수를 계산하였음.
  • 검증 조건:
    • 1년 초과: 날짜 차이가 365일보다 크면 경고 메시지를 표시하였음.
    • 종료 날짜가 이전인 경우: 날짜 차이가 음수이면 종료 날짜가 시작 날짜보다 이전이므로 경고를 표시하도록 함.

4. 날짜를 문자열로 가져오기

날짜를 "YYYY-MM-DD" 형식의 문자열로 가져오려면 toString() 메소드를 사용

    def get_date_strings(self):
        start_date_str = self.startDate.date().toString("yyyy-MM-dd")
        end_date_str = self.endDate.date().toString("yyyy-MM-dd")
        print("시작 날짜:", start_date_str)
        print("종료 날짜:", end_date_str)

5. 전체 코드

from PySide6.QtWidgets import QApplication, QMainWindow, QDateEdit, QMessageBox
from PySide6.QtCore import QDate
from PySide6 import uic
from main_ui import Ui_Form
import sys

class MainWindow(QMainWindow, Ui_Form):
    def __init__(self):
        super().__init__()
        self.setupUi(self)

        # 기본 날짜 설정
        self.startDate.setDate(QDate.currentDate().addMonths(-1))  # 시작 날짜: 한 달 전
        self.endDate.setDate(QDate.currentDate())  # 종료 날짜: 현재 날짜

        # 버튼 클릭 시 날짜 검증 및 출력 연결
        self.validateButton.clicked.connect(self.on_validate_button_clicked)

    def on_validate_button_clicked(self):
        if self.validate_dates():
            self.get_date_strings()

    def validate_dates(self) -> bool:
        start_date = self.startDate.date()
        end_date = self.endDate.date()
        days_difference = start_date.daysTo(end_date)

        if days_difference > 365:
            QMessageBox.warning(self, "날짜 오류", "최대 1년까지 설정 가능합니다.")
            return False
        elif days_difference < 0:
            QMessageBox.warning(self, "날짜 오류", "종료 날짜는 시작 날짜 이후여야 합니다.")
            return False
        else:
            return True

    def get_date_strings(self):
        start_date_str = self.startDate.date().toString("yyyy-MM-dd")
        end_date_str = self.endDate.date().toString("yyyy-MM-dd")
        print("시작 날짜:", start_date_str)
        print("종료 날짜:", end_date_str)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec())

Loading script...