from PyQt5 import QtWidgets, QtCore, QtGui import todo.gui.icon class DateInput(QtWidgets.QLineEdit): def __init__(self, init_date: str, parent): super().__init__(parent) self.setReadOnly(True) self.installEventFilter(self) self._date = init_date self.update(init_date) self._is_editing = False def eventFilter(self, source, event): if source is self and event.type() == QtCore.QEvent.FocusIn: if not self._is_editing: self._is_editing = True Calendar(self, self._date, self.update).exec_() else: self._is_editing = False self.clearFocus() return super(DateInput, self).eventFilter(source, event) def update(self, date: str): self._date = date self.setText(date) class Calendar(QtWidgets.QDialog): def __init__(self, parent: QtWidgets.QWidget, init_date: str, update_date): super().__init__(parent) self._update_date = update_date self._calendar = QtWidgets.QCalendarWidget(self) self.setWindowTitle("Sélectionnez une date") self.setMinimumSize(QtCore.QSize(300, 400)) layout = QtWidgets.QVBoxLayout(self) self.setLayout(layout) self._calendar.setMinimumDate(QtCore.QDate.currentDate()) self._calendar.activated.connect(self.select) if init_date: self._calendar.setSelectedDate(QtCore.QDate.fromString(init_date, "dd/MM/yyyy")) layout.addWidget(self._calendar) buttons = QtWidgets.QWidget(self) buttons_layout = QtWidgets.QHBoxLayout(buttons) layout.addWidget(buttons) accept_button = QtWidgets.QPushButton("Sélectionner", self) accept_button.setIcon(todo.gui.icon.dialog_ok(accept_button.style())) accept_button.clicked.connect(self.select) buttons_layout.addWidget(accept_button) reset_button = QtWidgets.QPushButton("Effacer", self) reset_button.setIcon(todo.gui.icon.dialog_reset(reset_button.style())) reset_button.clicked.connect(self.reset) buttons_layout.addWidget(reset_button) cancel_button = QtWidgets.QPushButton("Annuler", self) cancel_button.setIcon(todo.gui.icon.dialog_cancel(cancel_button.style())) cancel_button.clicked.connect(lambda: self.reject()) buttons_layout.addWidget(cancel_button) def select(self): self.accept() self._update_date(self._calendar.selectedDate().toString("dd/MM/yyyy")) def reset(self): self.accept() self._update_date("") def keyPressEvent(self, event): super().keyPressEvent(event) if event.key() in (QtCore.Qt.Key_Delete, QtCore.Qt.Key_Backspace): self.reset()