2016-09-28 2 views
0

Я использую виджет QDateEdit с QDateEdit.setCalendarPopup(True). Я пытаюсь подключить слот к событию, когда всплывающее окно календаря закрывается. См. Мой пример ниже для моих попыток, найденных в MyCalendarWidget. До сих пор ни одна из моих попыток не работала. Что я могу сделать для выполнения действия каждый раз, когда всплывающее окно виджета календаря закрывается, не только при изменении даты?Как выполнить действие, когда всплывающее окно QCalendarWidget закрывается?

from PyQt4 import QtGui, QtCore 
import sys 

class MainWindow(QtGui.QMainWindow): 
    def __init__(self, *args): 
     super(MainWindow,self).__init__(*args) 
     self._date = QtGui.QDateEdit() 
     self._date.setCalendarPopup(True) 
     self._date.setCalendarWidget(MyCalendarWidget()) 
     self.setCentralWidget(self._date) 

class App(QtGui.QApplication): 
    def __init__(self, *args): 
     super(App,self).__init__(*args) 
     self.main = MainWindow() 
     self.connect(self, QtCore.SIGNAL("lastWindowClosed()"), self.byebye) 
     self.main.show() 

    def byebye(self): 
     self.exit(0) 

class MyCalendarWidget(QtGui.QCalendarWidget): 
    def __init__(self, parent=None): 
     print("mycal initialized") 
     super(MyCalendarWidget, self).__init__(parent) 

     self.installEventFilter(self) 
     self._many = 2 
     self._many2 = 2 

    def focusInEvent(self, event): 
     print('-'*self._many + 'focus in') 
     if self._many == 2: 
      self._many = 4 
     else: 
      self._many = 2 
     super(MyCalendarWidget, self).focusInEvent(event) 

    def focusOutEvent(self, event): 
     print('-'*self._many2+'focus out') 
     if self._many2 == 2: 
      self._many2 = 4 
     else: 
      self._many2 = 2 
     super(MyCalendarWidget, self).focusOutEvent(event) 

    def closeEvent(self, event): 
     print('close') 
     super(MyCalendarWidget, self).closeEvent(event) 

    def mouseReleaseEvent(self, event): 
     print('mouse') 
     super(MyCalendarWidget, self).mouseReleaseEvent(event) 

def main(args): 
    global app 
    app = App(args) 
    app.exec_() 

if __name__ == "__main__": 
    main(sys.argv) 

ответ

0

Фигурные это - оказывается, мне нужно использовать clicked сигнал в QCalendarWidget. Это также устраняет необходимость в подклассе QCalendarWidget.

from PyQt4 import QtGui, QtCore 
import sys 

class MainWindow(QtGui.QMainWindow): 
    def __init__(self, *args): 
     super(MainWindow,self).__init__(*args) 
     self._date = QtGui.QDateEdit() 
     self._date.setCalendarPopup(True) 
     calendar = self._date.calendarWidget() 
     calendar.clicked.connect(self._clicked) 
     self.setCentralWidget(self._date) 

    def _clicked(self, date): 
     print('clicked') 

class App(QtGui.QApplication): 
    def __init__(self, *args): 
     super(App,self).__init__(*args) 
     self.main = MainWindow() 
     self.connect(self, QtCore.SIGNAL("lastWindowClosed()"), self.byebye) 
     self.main.show() 

    def byebye(self): 
     self.exit(0) 

def main(args): 
    global app 
    app = App(args) 
    app.exec_() 

if __name__ == "__main__": 
    main(sys.argv) 
Смежные вопросы