Search code examples
pythonpyqtpyqt5qcalendarwidget

Signal when QCalendarWidget popup opens?


Here is function which is painting cells of some dates that were previously calculated and saved in the "dates" list, function is working fine but I want to call that function when QDateEdit is clicked(when popup calendar is shown)

def init_gui(self):
    # Set signals of widgets
    self.dockwidget.date_to.calendarWidget().clicked.connect(self.paint_cell) # !! the signal I'm looking for
def paint_cell(self):    
    #QDateEdit / QCalendarWidget Highlight Dates
    keyword_format = QTextCharFormat()
    keyword_format.setBackground(Qt.gray)
    for date in dates:
        self.dockwidget.date_from.calendarWidget().setDateTextFormat(QDate.fromString(date,"yyyy-MM-dd") ,keyword_format)

self.dockwidget.date_from() # QDateEdit

self.dockwidget.date_from.calendarWidget() # QCalendarWidget

I know that there are signals, but they are all working when QDate is clicked: self.dockwidget.date_to.calendarWidget().activated.connect(self.paint_cell) self.dockwidget.date_to.calendarWidget().clicked.connect(self.paint_cell) self.dockwidget.date_to.calendarWidget().selectionChanged.connect(self.paint_cell)

but I have to paint the cells before these signals ,when the popup is displayed.

Does anyone know what that signal is?

enter image description here

NOTE: Code will be part of QGis plugin


Solution

  • with hints from @eyllanesc post, my working code now is:

    class Project(QDockWidget):
        """ QGIS Plugin Implementation. """
        popupSignal = QtCore.pyqtSignal()
    
        def __init__(self, iface):
            """ Constructor.
    
            :param iface: An interface instance that will be passed to this class
            which provides the hook by which you can manipulate the QGIS
            application at run time.
            :type iface: QgisInterface
            """
            QDockWidget.__init__(self)
    
            # Save reference to the QGIS interface
            self.iface = iface
    
            # initialize plugin directory
            self.plugin_dir = os.path.dirname(__file__)
    
            ...
    
        def eventFilter(self, obj, event):
            if self.dockwidget.date_to.calendarWidget() is obj and event.type() == QtCore.QEvent.Show:
                self.popupSignal.emit()
            return super(Project, self).eventFilter(obj, event)
    
        ....
    
        def run(self):
           """ Run method that loads and starts the plugin """
    
               self.dockwidget.date_to.calendarWidget().installEventFilter(self)
               self.popupSignal.connect(self.paint_cell)
    
    
        def paint_cell(self):
            #QDateEdit / QCalendarWidget Highlight Dates
            keyword_format = QTextCharFormat()
            keyword_format.setBackground(Qt.gray)
            for date in dates:
                 self.dockwidget.date_from.calendarWidget().setDateTextFormat(QDate.fromString(date, "yyyy-MM-dd"), keyword_format)