본문으로 바로가기
반응형

 

QCalendarWidget 은 사용자가 날짜를 선택할 수 있는 월별 달력 위젯입니다. 달력은 4개의 구성요소로 되어 있습니다. 상단에 사용자가 월을 변경할 수 있는 좌우 이동 버튼, 한달에서 하루를 나타내는 셀, 년도와 월을 선택하면 이동 가능한 콤보박스, 요일 이름과 주 번호를 표시하는 두 개의 헤더로 구성이 되어 있습니다.

 

오늘은 QCalendarWidget 을 이용해서 아래와 같은 순서로 Calendar 를 화면에 표시해 보겠습니다.

 

  • 캘린더 위젯 생성
  • 캘린더의 selectionChanged 시그널에 함수 연결
  • selectionChanged 연결한 함수에 달력에서 선택한 값 라벨에 표시
  • 캘린더에서 받은 QDate 값을 사용자가 원하는 날짜 형태로 Format 변경

 

캘린더 객체에서 선택한 날짜를 표시할 QLabel 을 추가합니다.

from PyQt5.QtWidgets import QLabel

# Calendar 에서 선택한 값 표시할 QLabel 
self.calendar_label = QLabel(self)
self.calendar_label.setGeometry(10, 270, 100, 30)
self.calendar_label.setStyleSheet('background-color:#D3D3D3')

 

다음은 캘린더 객체를 생성하겠습니다. QtWidgets 패키지에 있는 QCalendarWidget 클래스를 사용했습니다. QCalendarWidget 이 가지고 있는 시그널 중에 selectionChanged() 는 달력 날짜를 선택하면 발생하는 이벤트입니다. 여기에 calendar_change() 슬롯을 연결했습니다. 함수에서는 selectionChanged() 시그널이 발생할 때 화면에 추가한 라벨에 달력에서 선택한 날짜를 표시할 것입니다.

from PyQt5.QtWidgets import QCalendarWidget

# CalendarWidget 위젯 화면에 표시
self.cal = QCalendarWidget(self)
self.cal.setGeometry(10, 10, 350, 250)
self.cal.setGridVisible(True)
self.cal.selectionChanged.connect(self.calendar_change)

 

calendar_change() 함수에서는 QCalendarWidget 객체의 selectedDate() 함수를 이용해서 현재 선택한 날짜 정보를 가져옵니다. 리턴 받은 객체는 QDate 입니다. QDate 객체에 담긴 날짜를 문자열로 바꾸기 위해서는 toString() 함수가 필요합니다. 함수의 파라미터로 보고 싶은 날짜의 포맷을 넘깁니다. 변환한 날짜 문자열 값은 이전에 생성한 라벨에 setText() 함수를 사용해서 추가합니다.

# Calendar Open 함수
@pyqtSlot()
def calendar_change(self):
    cal_date = self.cal.selectedDate()
    strDate = cal_date.toString('yyyy.MM.dd')  # QDate 를 str 로 변환
    self.calendar_label.setText(strDate)

 

위의 내용을 구현한 결과 화면은 다음과 같습니다. 그림처럼 달력에서 날짜를 선택하면 바로 아래에 있는 라벨에 나타납니다.

 

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

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


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

        # CalendarWidget 위젯 화면에 표시
        self.cal = QCalendarWidget(self)
        self.cal.setGeometry(10, 10, 350, 250)
        self.cal.setGridVisible(True)
        self.cal.selectionChanged.connect(self.calendar_change)

        # min max 기간 설정
        #self.cal.setMinimumDate(QDate(2020, 8, 25))
        #self.cal.setMaximumDate(QDate(2020, 8, 27))

        # Calendar 에서 선택한 값 표시할 QLabel
        self.calendar_label = QLabel(self)
        self.calendar_label.setGeometry(10, 270, 100, 30)
        self.calendar_label.setStyleSheet('background-color:#D3D3D3')

        # 현재날짜 달력에 표시 버튼
        # self.today_btn = QPushButton('Today', self)
        # self.today_btn.clicked.connect(self.select_today)
        # self.today_btn.setGeometry(120, 270, 100, 30)

    # Calendar Open 함수
    @pyqtSlot()
    def calendar_change(self):
        cal_date = self.cal.selectedDate()
        strDate = cal_date.toString('yyyy.MM.dd')  # QDate 를 str 로 변환
        self.calendar_label.setText(strDate)

    # 달력에서 현재를 선택
    @pyqtSlot()
    def select_today(self):
        # self.cal.showToday()
        # self.cal.showNextMonth()
        #self.cal.setSelectedDate(QDate())
        self.cal.currentPageChanged(self, 2022, 10)


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