keyPressEvent() with QCalendarWidget

John F Sturtz john at sturtz.org
Mon Nov 7 04:51:00 GMT 2022


Maurizio Berti wrote on 11/5/2022 6:09 PM:
>  [ "crossposted" as John (who I hope doesn't mind) did reply 
> privately, but I believe that this might be useful to others]
Don't mind at all.  :-)
> That said, the reason is caused by the fact that the view used in 
> QCalendarWidget is actually a private subclass (named QCalendarView) 
> which on its own overrides keyPressEvent.
> My understanding is that, since that class is not publicly declared, 
> you cannot override any of its methods, and you can only use its 
> functions by explicitly calling them (like installing the event filter).
This makes sense (from 10,000 feet; I'm not a C++ programmer).

--------

Here's one more thing for you, or anyone else who might be interested, 
to ponder.  It seems there's one small problem with the date that the 
date edit popup initially displays.

If I call setSelectedDate() when the QCalendarWidget is first displayed 
and set the selected date to something other than today's date, that 
date will correctly show in the calendar.  But then if I hit a character 
key to display the popup, it will display today's date, not the one 
selected in the calendar.

Note that if I then click on (or arrow to) some other date in the 
calendar to select it, then display the popup, it will display the 
correct (newly-selected) date.  So it seems the popup must respond to 
the selectionChanged signal.  But evidently not the first time.  (I'm 
guessing maybe the selectionChanged signal isn't connected until after 
the popup widget is created the first time?  I spent a bit of time 
looking through the source code, but it's a little over my head ...)

This isn't really a big huge deal.  Mostly just a curiosity.  I tried 
just about everything I could think of to get around it, but couldn't 
find anything.

from PyQt5.QtWidgets import QApplication, QCalendarWidget
from PyQt5.QtCore import QDate
import sys

class Calendar(QCalendarWidget):

     def __init__(self, parent=None):
         super().__init__(parent)

         self.setDateEditEnabled(True)

     def showEvent(self, event):

         # This sets the calendar's selected date 4 days ahead of 
today's date.
         # The calendar will correctly display it, but the first time 
you display
         # the date edit popup, it will initially display today's date, 
not the
         # date selected in the calendar.
self.setSelectedDate(QDate.currentDate().addDays(4))

         # I tried emitting the selectionChanged signal explicitly, but that
         # didn't work either
         # self.selectionChanged.emit()


app = QApplication(sys.argv)
window = Calendar()
window.show()

app.exec()

/John
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://www.riverbankcomputing.com/pipermail/pyqt/attachments/20221106/ca36fdb2/attachment.htm>


More information about the PyQt mailing list