【发布时间】:2019-05-12 04:06:20
【问题描述】:
我的目标是禁止用户在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 事件。示例:我对一个红色方块进行了 photoshop 处理,点击它,它会选择 6 月 4 日(即使我们在屏幕截图中是 5 月)。
如何让那些日子无法选择?
我在currentPageChanged 事件上尝试了setDateRange,但它没有按预期工作:
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 不起作用,因为如果我添加它以将选择限制在本月,那么日历顶部的“转到下个月或上个月”按钮将不起作用,我需要用户能够更改月份。我只是不希望日历显示不属于本月页面的日期。
【问题讨论】:
-
我了解您想要什么,但是如果其他月份或日期被禁用(这就是您想要的),当您按下顶部用于 go 的按钮时,您会观察到什么到下个月还是上个月?
-
什么都不会发生,如果我使用
setDateRange这些按钮将被禁用。我希望这些按钮不会被禁用。 -
我想你不明白我的意思,我明白这不是解决方案,我的意思是这些按钮也必须被禁用,因为它们根本不会为用户服务,因为下一个或上一个页面不会有任何内容。
-
既然你提到了,那是有道理的。那我应该采取什么方法呢?
-
我的想法是禁用按钮以及其他月份的剩余天数。
标签: python python-3.x pyqt5 pyside2 qcalendarwidget