我想把文本放在 pyqt QCalendarWidget
Posted
技术标签:
【中文标题】我想把文本放在 pyqt QCalendarWidget【英文标题】:I want to put the text in pyqt QCalendarWidget 【发布时间】:2019-04-14 09:09:08 【问题描述】:我想将p.drawText (r.x () + 10, r.y () + 33, ' / '. Format ('tset1', 'test2')
条件的文本放在选定的QCalendarWidget
日期上。但这并不好。
import sys
from PyQt5.QtGui import *
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
class main_window(QWidget):
def __init__(self):
super(main_window, self).__init__()
self.resize(1280, 900)
self.Calendar()
def Calendar(self):
self.cal = QCalendarWidget(self)
self.cal.resize(500, 500)
self.cal.clicked.connect(self.Calendar_click)
def Calendar_click(self):
p = QPainter()
r = QRect(0,0,10,10)
d = self.cal.selectedDate()
self.cal.paintCell(p, r, d)
if (d == QDate.currentDate()):
f = QFont()
f.setPixelSize(10)
f.setBold(True)
f.setItalic(True)
p.setFont(f)
p.drawText(r.x()+10, r.y()+33, '/'.format('tset1','test2'))
if __name__ == '__main__':
app = QApplication(sys.argv)
main = main_window()
main.show()
我尝试了很多,但我仍然不知道如何在选定的日期上放置小文本。
【问题讨论】:
【参考方案1】:你必须覆盖paintCell()
方法,因为这个方法是在paintEvent()中调用的:
class CalendarWidget(QCalendarWidget):
def paintCell(self, painter, rect, date):
super(CalendarWidget, self).paintCell(painter, rect, date)
if date == self.selectedDate():
painter.save()
f = QFont()
f.setPixelSize(10)
f.setBold(True)
f.setItalic(True)
painter.setFont(f)
r = rect
painter.drawText(
rect.topLeft() + QPoint(10, 33),
"/".format("tset1", "test2"),
)
painter.restore()
class main_window(QWidget):
def __init__(self):
super(main_window, self).__init__()
self.resize(1280, 900)
self.Calendar()
def Calendar(self):
self.cal = CalendarWidget(self)
self.cal.resize(500, 500)
更新:
如果您希望保留文本,则必须保存日期并在必要时重新绘制,因为 Qt 会重新绘制所有内容
class CalendarWidget(QCalendarWidget):
def __init__(self, parent=None):
super(CalendarWidget, self).__init__(parent)
self._selected_dates = set()
self._selected_dates.add(self.selectedDate())
self.clicked.connect(self.on_clicked)
@pyqtSlot(QDate)
def on_clicked(self, date):
self._selected_dates.add(date)
def paintCell(self, painter, rect, date):
super(CalendarWidget, self).paintCell(painter, rect, date)
if date in self._selected_dates:
painter.save()
f = QFont()
f.setPixelSize(10)
f.setBold(True)
f.setItalic(True)
painter.setFont(f)
r = rect
painter.drawText(
rect.topLeft() + QPoint(10, 33),
"/".format("tset1", "test2"),
)
painter.restore()
【讨论】:
哇!谢谢你。最后,我想保留一个选定的文本,但我该怎么办? @Lee 我听不懂你,你自己解释清楚,即使选择了另一个日期,你是否要保留文字? 是的,如果您选择不同的日期,这就是您保留文本的方式。 谢谢 :) 这很难但很有帮助。以上是关于我想把文本放在 pyqt QCalendarWidget的主要内容,如果未能解决你的问题,请参考以下文章