在 Qt5 日历小部件中突出显示日期间隔
Highlight date interval in a Qt5 Calendar Widget
我想在选定的开始日期和结束日期之间的 CalendarWidget 中突出显示每一天。
我的问题是 CalendarWidget 仅允许在 QTCreator 中使用 SingleSelection,但表示可以通过编程方式更改其他内容。
我发现了一些使用 QPainter 和 paintCell() 方法的提示,但我直到不知道从哪里开始。互联网对我没有帮助。
我尝试先在 buttonClick 上更改单个日期,但即使这样也不起作用,你能给我一个如何使用它的建议吗?
btn_test_pressed(self):
painter = QPainter()
painter.setPen(QtGui.QPen(QtCore.Qt.green))
painter.fillRect(QtCore.QRectF(250, 250, 10, 10), 0, 5760)
rect = QRect()
date = datetime.datetime.now() - datetime.timedelta(1)
self.calendarWidget.paintCell(painter, rect, date)
要更新单个日期的样式,您可以使用 QCalendarWidget.setDateTextFormat()
。这是一个基本实现,说明如何使用它来突出显示一系列日期,可以通过按住 shift 键选择开始和结束日期来选择这些日期。
from PyQt5.QtGui import QPalette, QTextCharFormat
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QApplication, QCalendarWidget
class MyCalendar(QCalendarWidget):
def __init__(self):
super().__init__()
self.begin_date = None
self.end_date = None
self.highlight_format = QTextCharFormat()
self.highlight_format.setBackground(self.palette().brush(QPalette.Highlight))
self.highlight_format.setForeground(self.palette().color(QPalette.HighlightedText))
self.clicked.connect(self.date_is_clicked)
print(super().dateTextFormat())
def format_range(self, format):
if self.begin_date and self.end_date:
d0 = min(self.begin_date, self.end_date)
d1 = max(self.begin_date, self.end_date)
while d0 <= d1:
self.setDateTextFormat(d0, format)
d0 = d0.addDays(1)
def date_is_clicked(self, date):
# reset highlighting of previously selected date range
self.format_range(QTextCharFormat())
if QApplication.instance().keyboardModifiers() & Qt.ShiftModifier and self.begin_date:
self.end_date = date
# set highilighting of currently selected date range
self.format_range(self.highlight_format)
else:
self.begin_date = date
self.end_date = None
if __name__ == "__main__":
app = QApplication([])
calendar = MyCalendar()
calendar.show()
app.exec()
截图:
我想在选定的开始日期和结束日期之间的 CalendarWidget 中突出显示每一天。 我的问题是 CalendarWidget 仅允许在 QTCreator 中使用 SingleSelection,但表示可以通过编程方式更改其他内容。
我发现了一些使用 QPainter 和 paintCell() 方法的提示,但我直到不知道从哪里开始。互联网对我没有帮助。 我尝试先在 buttonClick 上更改单个日期,但即使这样也不起作用,你能给我一个如何使用它的建议吗?
btn_test_pressed(self):
painter = QPainter()
painter.setPen(QtGui.QPen(QtCore.Qt.green))
painter.fillRect(QtCore.QRectF(250, 250, 10, 10), 0, 5760)
rect = QRect()
date = datetime.datetime.now() - datetime.timedelta(1)
self.calendarWidget.paintCell(painter, rect, date)
要更新单个日期的样式,您可以使用 QCalendarWidget.setDateTextFormat()
。这是一个基本实现,说明如何使用它来突出显示一系列日期,可以通过按住 shift 键选择开始和结束日期来选择这些日期。
from PyQt5.QtGui import QPalette, QTextCharFormat
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QApplication, QCalendarWidget
class MyCalendar(QCalendarWidget):
def __init__(self):
super().__init__()
self.begin_date = None
self.end_date = None
self.highlight_format = QTextCharFormat()
self.highlight_format.setBackground(self.palette().brush(QPalette.Highlight))
self.highlight_format.setForeground(self.palette().color(QPalette.HighlightedText))
self.clicked.connect(self.date_is_clicked)
print(super().dateTextFormat())
def format_range(self, format):
if self.begin_date and self.end_date:
d0 = min(self.begin_date, self.end_date)
d1 = max(self.begin_date, self.end_date)
while d0 <= d1:
self.setDateTextFormat(d0, format)
d0 = d0.addDays(1)
def date_is_clicked(self, date):
# reset highlighting of previously selected date range
self.format_range(QTextCharFormat())
if QApplication.instance().keyboardModifiers() & Qt.ShiftModifier and self.begin_date:
self.end_date = date
# set highilighting of currently selected date range
self.format_range(self.highlight_format)
else:
self.begin_date = date
self.end_date = None
if __name__ == "__main__":
app = QApplication([])
calendar = MyCalendar()
calendar.show()
app.exec()
截图: