ncica
ncica

Reputation: 7206

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

Upvotes: 1

Views: 1189

Answers (2)

ncica
ncica

Reputation: 7206

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)

Upvotes: 0

eyllanesc
eyllanesc

Reputation: 243897

You do not have to use any signal if you want to set before displaying the calendarWidget, just call paint_cell in the constructor.

# constructor
self.paint_cell()
self.dockwidget.date_to.calendarWidget().activated.connect(self.paint_cell)
# ...

Update:

There is no default signal for that circumstance, so believe it and you can use an event filter to monitor the Event.Show event and then emitted the signal.

from PyQt5 import QtCore, QtWidgets


class DateEdit(QtWidgets.QDateEdit):
    popupSignal = QtCore.pyqtSignal()

    def __init__(self, parent=None):
        super(DateEdit, self).__init__(parent)
        self.setCalendarPopup(True)
        self.calendarWidget().installEventFilter(self)

    def eventFilter(self, obj, event):
        if self.calendarWidget() is obj and event.type() == QtCore.QEvent.Show:
            self.popupSignal.emit()
        return super(DateEdit, self).eventFilter(obj, event)


if __name__ == "__main__":
    import sys

    app = QtWidgets.QApplication(sys.argv)
    w = DateEdit()
    w.popupSignal.connect(lambda: print("popup"))
    w.show()
    sys.exit(app.exec_())

Upvotes: 2

Related Questions