Reputation: 7206
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?
NOTE: Code will be part of QGis plugin
Upvotes: 1
Views: 1189
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
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