개요
PySide6 와 Qt Designer 를 사용하여 날짜 입력 프로그램을 구현하는 방법을 기록해보려고 한다.
특히 QDateEdit
위젯을 활용해 연도-월-일(YYYY-MM-DD) 형식의 날짜를 입력 받고,
기본 날짜 설정과 날짜 검증까지 구현해보겠다.
1. Qt Designer에서 UI 설계
- Qt Designer를 사용하여 GUI를 설계해보자.
1. Qt Designer를 실행하고 왼쪽 위젯 패널에 QDateEdit 위젯 두개 추가
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. 날짜 검증 기능 구현
사용자가 입력한 날짜가 유효한지 검증하고, 시작 날짜와 종료 날짜의 차이가 최대 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())