2024-01-21

QCalendarWidget と QDate ~ PySide6

PySide (Qt for Python) は、Qt(キュート)の Python バインディングで、GUI などを構築するためのクロスプラットフォームなライブラリです。Linux/X11, macOS および Microsoft Windows をサポートしています。配布ライセンスは LGPL で公開されています。

python で日付や時間情報を扱う時にはもっぱら datetime モジュールを利用してきました。しかし GUI ライブラリに PySide6 を利用するのであれば、日付や時間情報も QDate あるいは QDateTime クラスを利用した方が便利のように思えます。

簡単なサンプルの作成を重ねて評価しようと、今回は QCalendarWidget と QDate をサンプルにしてみました。

下記の OS 環境で動作確認をしています。

Fedora Workstation 39 x86_64
Python 3.12.1
PySide6 6.6.1

サンプルを下記に示しました。

qt_calendar.py
#!/usr/bin/env python
# coding: utf-8
import sys
from PySide6.QtCore import QDate
from PySide6.QtWidgets import (
QApplication,
QCalendarWidget,
QLineEdit,
QMainWindow,
QStyle,
QToolBar,
QToolButton,
)
class DateEntry(QLineEdit):
def __init__(self):
super().__init__()
self.qdate: QDate | None = None
self.setEnabled(False)
def getDate(self) -> QDate | None:
return self.qdate
def setDate(self, qdate: QDate):
self.qdate = qdate
self.setText('{:0=4}-{:0=2}-{:0=2}'.format(
qdate.year(), qdate.month(), qdate.day()
))
class Example(QMainWindow):
def __init__(self):
super().__init__()
self.calendar: QCalendarWidget | None = None
toolbar = QToolBar()
self.addToolBar(toolbar)
self.entry = DateEntry()
toolbar.addWidget(self.entry)
but_calendar = QToolButton()
icon = self.style().standardIcon(QStyle.StandardPixmap.SP_DialogApplyButton)
but_calendar.setIcon(icon)
but_calendar.clicked.connect(self.on_clicked)
toolbar.addWidget(but_calendar)
def on_date_selected(self, qdate: QDate):
self.entry.setDate(qdate)
if self.calendar is not None:
self.calendar.hide()
self.calendar.deleteLater()
def on_clicked(self):
self.calendar = QCalendarWidget()
qdate = self.entry.getDate()
if qdate is not None:
self.calendar.setSelectedDate(qdate)
self.calendar.activated.connect(self.on_date_selected)
self.calendar.show()
def main():
app = QApplication(sys.argv)
ex = Example()
ex.show()
sys.exit(app.exec())
if __name__ == '__main__':
main()
view raw qt_calendar.py hosted with ❤ by GitHub

このサンプルを実行すると、ツールバーを持った QMainWindow クラスのインスタンスが表示されます。ツールバー上の右側にある Apply ボタンをクリックすると QCalendarWidget クラスのインスタンス(カレンダーと呼びます)が表示されます。ツールバー上の左側にある DateEntry クラスのインスタンスに日付が表示されていればその日付が、そうでなければ本日の日付が選択状態(青色)になります。

マウスでカレンダー上の日付を選択してダブルクリックすると、カレンダーが閉じられます。その際、カレンダーは選択された日付を QDate のインスタンスで返します。

qt_calendar.py の実行例

返された日付は、ツールバーの左側にある DateEntry クラスのインスタンス上に表示されます。DateEntry は QLineEidt を継承したクラスで、setDate メソッドで渡された QDate の日付情報をそのままインスタンスで保持し、yyyy-mm-dd の文字列に整形して表示します。

参考サイト

  1. datetime --- 基本的な日付型および時間型
  2. QDate - Qt for Python
  3. QDateTime - Qt for Python

 

ブログランキング・にほんブログ村へ bitWalk's - にほんブログ村 にほんブログ村 IT技術ブログ オープンソースへ
にほんブログ村

オープンソース - ブログ村ハッシュタグ
#オープンソース



0 件のコメント: