QCalendarWidget - 달력 위젯

 

 

QCalendarWidget - 달력 위젯

 

Pyside2에서의 달력 위젯은 날짜를 손쉽게 선택할 수 있는 기능을 제공한다.

 

Qt designer로 아래와 같이 ui 파일을 구성한다.

 

 

본 강좌에서 사용할 것은 상단의 달력 위젯인 QCalendarWidget이다.

 

 

만드는 방법은 아래와 같다. datetest.ui라는 파일로 저장한다. QTimeEdit, QDateEdit, QDateTimeEdit, QComboBox 등도 미리 만들어 둔다.

 

 

QCalendarWidget에서 많이 사용하는 메서드는 아래와 같이 정리할 수 있다.

 

1. 현재의 날짜 받아오기

2. QCalendarWidget에 현재 날짜 설정하기

3. 원하는 년, 월로 QCalendarWidget 이동하기

 

 

1. 현재의 날짜 받아오기

 

1) 메서드로 날짜 추출

QCalendarWidget에서 현재의 날짜를 받아오는 메서드는 selectedDate() 이다. 따라서 아래와 같이 날짜를 받아온다.

 

qc = QCalendarWidget()

date = qc.selectedDate()

 

위는 프로그램적으로 QCalendarWidget을 생성하여 표현한 것이고, GUI 프로그램으로 표현하면 아래와 같다.

UI_set = QtUiTools.QUiLoader().load(resource_path("datetest.ui"))

date = UI_set.Calendar.selectedDate()

 

 

 

date에는 현재 선택된 달력의 날짜가 들어있다. 이를 그대로 출력하면 아래와 같이 나타난다.

print(date)
PySide2.QtCore.QDate(2019, 12, 13)

 

즉, date에는 QDate 형태의 날짜가 들어가 있다.

 

이를 년, 월, 일, 요일로 따로 뽑아내려면 아래와 같은 메서드를 사용하면 된다.

년 - int  date.year()
월 - int  date.month()
일 - int  date.day()
요일 - int ( 1 ~ 7, 월 ~ 일)  date.dayOfWeek()

 

각각 추출된 년, 월, 일, 요일을 "2019-12-13"과 같이 원하는 형태로 출력하면 된다.

 

 

2) QString format으로 날짜 추출

QDate 형태로 저장된 날짜를 string format으로 추출할 수 있다.

 

사용하는 메서드는  toString() 이다.

 

print(date.toString())
금 12 13 2019

 

toString() 메서드는 전달 인수를 QString 포맷으로 원하는 모양을 만들어 낼 수 있다.

print(date.toString("yyyy-MM-dd))
2019-12-13

 

toString()에 인자로 전달되는 QString의 종류는 다음과 같다.

ExpressionOutput

d the day as number without a leading zero (1 to 31)
dd the day as number with a leading zero (01 to 31)
ddd the abbreviated localized day name (e.g. 'Mon' to 'Sun'). Uses the system locale to localize the name, i.e. QLocale::system().
dddd the long localized day name (e.g. 'Monday' to 'Sunday'). Uses the system locale to localize the name, i.e. QLocale::system().
M the month as number without a leading zero (1-12)
MM the month as number with a leading zero (01-12)
MMM the abbreviated localized month name (e.g. 'Jan' to 'Dec'). Uses the system locale to localize the name, i.e. QLocale::system().
MMMM the long localized month name (e.g. 'January' to 'December'). Uses the system locale to localize the name, i.e. QLocale::system().
yy the year as two digit number (00-99)
yyyy the year as four digit number

출처 : https://doc.qt.io/archives/qt-5.13/qdatetime.html#toString

 

 

 

2. QCalendarWidget에 현재 날짜 설정하기

 

QCalendarWidget이 처음 생성되면 시스템의 날짜를 현재 날짜로 세팅한다. 이를 강제로 다른 날짜로 세팅하기 위해서는 아래의 메서드를 사용한다. 날짜를 변경하면 달력 위젯의 페이지도 설정한 년, 월로 변경된다.

 

setSelectedDate(QtCore.QDate(년, 월, 일) - 년, 월, 일은 int 이다.

 

사용방법은 아래와 같다.

print(date.toString("yyyy-MM-dd))

qc.setSelectedDate(Qtcore.QDate(2012, 7, 12)

date = qc.selectedDate()

print(date.toString("yyyy-MM-dd))

2019-12-13

2012-07-12

 

 

 

3. 원하는 년, 월로 QCalendarWidget 이동하기

 

setSelectedDate()를 사용하면 내부적으로 QCalendarWidget 현재의 날짜와 위젯의 페이지가 바뀐다.

하지만 QCalendarWidget의 페이지만을 변경하기 위해서는 아래의 메서드를 사용한다.

 

setCurrentPage(년, 월) - 년, 월은 int 이다.

 

사용방법은 아래와 같다.

qc.setCurrentPage(2012, 7)

 

위 명령을 실행시키면, 달력 위젯의 페이지가 변경된다.

 

 

 

 

 

전체 코드

import sys
import os
from PySide2 import QtUiTools, QtGui, QtCore
from PySide2.QtWidgets import QApplication, QMainWindow


class MainView(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setupUI()

 

    def setupUI(self):
        global UI_set, cbox

 

        UI_set = QtUiTools.QUiLoader().load(resource_path("datetest.ui"))

 

        UI_set.BTN_check.clicked.connect(checkcalendar)

       

        self.setCentralWidget(UI_set)
        self.setWindowTitle("GUI Program Test")
        self.setWindowIcon(QtGui.QPixmap(resource_path("./images/jbmpa.png")))
        self.resize(730, 490)
        self.show()

 

def checkcalendar():

    # 현재 선택된 시간(시스템 시간)을 저장

    date = UI_set.Calendar.selectedDate()
    UI_set.TE_result.setText(date.toString("yyyy-MM-dd"))

 

    # 현재 선택된 시간을 변경, 자동으로 위젯 페이지 변경
    UI_set.Calendar.setSelectedDate(QtCore.QDate(2012, 7, 12))

    #  변경된 시간을 다시 저장
    date = UI_set.Calendar.selectedDate()
    UI_set.TE_result.append(date.toString("yyyy-MM-dd"))

 

    # 달력 위젯 페이지만 변경

    UI_set.Calendar.setCurrentPage(2012, 7)

 

    # 메서드로 년, 월, 일, 요일 출력하기

    UI_set.TE_result.append(str(date))
    UI_set.TE_result.append(str(date.year()))
    UI_set.TE_result.append(str(date.month()))
    UI_set.TE_result.append(str(date.day()))
    UI_set.TE_result.append(str(date.dayOfWeek()))


# 파일 경로
# pyinstaller로 원파일로 압축할때 경로 필요함
def resource_path(relative_path):
    if hasattr(sys, '_MEIPASS'):
        return os.path.join(sys._MEIPASS, relative_path)
    return os.path.join(os.path.abspath("."), relative_path)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    main = MainView()
    # main.show()
    sys.exit(app.exec_())

 

 

 

 

 

출처 : 

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

+ Recent posts