Heute stand ich vor einer scheinbar einfachen Aufgabe: Stellen Sie im Kalender-Widget in PyQt5 sicher, dass das heutige Datum von einem grünen Rahmen umgeben ist. Es stellte sich jedoch heraus, dass es auf Russisch überhaupt keine Materialien zu diesem Thema gibt, und auf Englisch gibt es nur eine Frage zum Stapelüberlauf. Ich habe beschlossen, anderen Entwicklern, die sich gerade mit dieser Bibliothek vertraut machen, das Leben zu erleichtern und zu beschreiben, wie ich dieses Problem gelöst habe.
Erstellen Sie einen Kalender
Öffnen Sie zum Erstellen eines Kalenderfensters Qt Creator oder Qt Designer. Wählen Sie im Seitenmenü auf der Registerkarte Widgets anzeigen die Option Kalender aus und ziehen Sie sie in den Editor:
.ui
-. Python-, :
pyuic5 path/to/design.ui -o output/path/to/design.py
, , , , - PyQt. PATH PyQt.
design.py
, .
. , . CustomCalendar.py
, QtWidgets.QCalendarWidget
:
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtCore import Qt
class MyCalendar(QtWidgets.QCalendarWidget):
def __init__(self, parent=None):
QtWidgets.QCalendarWidget.__init__(self, parent)
:
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtCore import Qt
class MyCalendar(QtWidgets.QCalendarWidget):
def __init__(self, parent=None):
QtWidgets.QCalendarWidget.__init__(self, parent)
def paintCell(self, painter, rect, date):
QtWidgets.QCalendarWidget.paintCell(self, painter, rect, date)
if date == date.currentDate():
painter.setBrush(QtGui.QColor(0, 200, 200, 50))
painter.drawRect(rect)
printCell
:
painter
- Qt,
rect
- , ,
date
- ,
, , . -, . , , , , .
design.py
CustomCalendar
QtWidgets.QCalendarWidget
MyCalendar
:
from PyQt5 import QtCore, QtGui, QtWidgets
from CustomCalendar import MyCalendar
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(600, 502)
MainWindow.setStyleSheet("")
self.centralWidget = QtWidgets.QWidget(MainWindow)
self.centralWidget.setObjectName("centralWidget")
self.calendarWidget = MyCalendar(self.centralWidget)
self.calendarWidget.setGeometry(QtCore.QRect(60, 50, 471, 341))
self.calendarWidget.setObjectName("calendarWidget")
MainWindow.setCentralWidget(self.centralWidget)
self.menuBar = QtWidgets.QMenuBar(MainWindow)
self.menuBar.setGeometry(QtCore.QRect(0, 0, 600, 22))
self.menuBar.setObjectName("menuBar")
MainWindow.setMenuBar(self.menuBar)
self.mainToolBar = QtWidgets.QToolBar(MainWindow)
self.mainToolBar.setObjectName("mainToolBar")
MainWindow.addToolBar(QtCore.Qt.TopToolBarArea, self.mainToolBar)
self.statusBar = QtWidgets.QStatusBar(MainWindow)
self.statusBar.setObjectName("statusBar")
MainWindow.setStatusBar(self.statusBar)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
, . logic.py
:
from PyQt5 import QtWidgets
import sys
import design
class CalendarApp(QtWidgets.QMainWindow, design.Ui_MainWindow):
def __init__(self):
super().__init__()
self.setupUi(self)
def main():
app = QtWidgets.QApplication(sys.argv)
window = CalendarApp()
window.show()
app.exec_()
if __name__ == '__main__':
main()
, :
, paintRect
painter
, :
def paintCell(self, painter, rect, date):
QtWidgets.QCalendarWidget.paintCell(self, painter, rect, date)
if date == date.currentDate():
painter.setBrush(QtGui.QColor(0, 200, 200, 50))
painter.setPen(QtGui.QColor(0, 0, 0, 0))
painter.drawRect(rect)
Die ursprüngliche Aufgabe bestand darin, eine grüne Box für das heutige Datum zu erstellen. Es scheint, dass es ausreicht, ein Rechteck mit einem grünen Strich zu zeichnen. Entfernen Sie dazu die Linie von painter.setBrush
und stellen Sie die gewünschte Farbe auf ein painter.setPen
. Aber wenn Sie dies tun, stellt sich heraus, dass es nicht sehr schön ist:
Ich konnte keine Antwort darauf finden, wie die Ränder für dieses Rechteck gleich dick werden sollen. Nichts hindert Sie jedoch daran, vier separate Linien zu zeichnen:
def paintCell(self, painter, rect, date):
QtWidgets.QCalendarWidget.paintCell(self, painter, rect, date)
if date == date.currentDate():
painter.setPen(QtGui.QPen(QtGui.QColor(0, 200, 200), 2, Qt.SolidLine, Qt.RoundCap))
painter.drawLine(rect.topRight(), rect.topLeft())
painter.drawLine(rect.topRight(), rect.bottomRight())
painter.drawLine(rect.bottomLeft(), rect.bottomRight())
painter.drawLine(rect.topLeft(), rect.bottomLeft())
Und das Endergebnis:
Was kannst du sonst noch tun
Mit der Hilfe können painter
Sie nicht nur eine Zelle kreisen oder übermalen, sondern auch Text darin schreiben oder eine geometrische Form zeichnen. Es hängt alles vom zu lösenden Problem und der Vorstellungskraft des Entwicklers ab.