Я намерен отключить, чтобы пользователи могли кликать по дням, не относящимся к текущему месяцу, в QCalendarWidget
, поэтому я создал подкласс виджета, чтобы сделать это.До сих пор я мог сделать так, чтобы те дни вообще не отображали текст (отлично).Это код:
class QCustomCalendar(QCalendarWidget):
"""Create my own Calendar with my own options."""
def __init__(self, parent=None):
"""Initializing functions"""
QCalendarWidget.__init__(self, parent)
self.setEnabled(True)
self.setGeometry(QRect(0, 0, 320, 250))
self.setGridVisible(False)
self.setHorizontalHeaderFormat(QCalendarWidget.SingleLetterDayNames)
self.setVerticalHeaderFormat(QCalendarWidget.NoVerticalHeader)
self.setNavigationBarVisible(True)
self.setDateEditEnabled(True)
self.setObjectName("calendarWidget")
def paintCell(self, painter, rect, date):
"""Sub-class this and repaint the cells"""
# Render only this-month days
month = "{0}-{1}".format(str(self.yearShown()), str(self.monthShown()).zfill(2))
day = str(date.toPython())
if not day.startswith(month):
return
QCalendarWidget.paintCell(self, painter, rect, date)
Однако, если я нажимаю на день без рендеринга, он все равно считается и запускает событие clicked
.Пример: я сфотографировал красный квадрат, где щелкнув по нему, он выбрал бы 4 июня (хотя на скриншоте мы находимся в мае).
Как отключить эти дни, чтобы их нельзя было выбрать?
Я пытался setDateRange
на currentPageChanged
событии, но он не работает, как ожидалось:
def __init__(self, parent=None):
# some code
self.currentPageChanged.connect(self.store_current_month)
self.clicked.connect(self.calendar_itemchosen)
def store_current_month(self):
self.CURRENT_MONTH = "{0}-{1}".format(str(self.yearShown()), str(self.monthShown()).zfill(2))
def calendar_itemchosen(self):
day = str(self.selectedDate().toPython())
print(day)
if day.startswith(self.CURRENT_MONTH):
selection = self.selectedDate()
# some code
self.close()
Результат нажатия на этот красный квадрат с этим кодом:
2018-06
2018-06-04
Так что я думаю, Qt сначала вызывает событие currentPageChanged
, когда вы выбираете дату в другом месяце.setDateRange
не будет работать, потому что, если я добавлю его, чтобы ограничить выбор только этим месяцем, то кнопки в верхней части календаря «перейти к следующему или предыдущему месяцу» не будут работать, и мне нужно, чтобы пользователь могменять месяцы.Я просто не хочу, чтобы в календаре показывались дни, которые не принадлежат этой странице месяца.