Только начинаю разбираться с PyQt4. И, похоже, попал в первый серьезный ступор.
Итак, есть два главных окна приложения (LoginWindow, MainWindow), они оба наследуют QMainWindow. У них, обоих, есть меню, причем некоторые элементы этого меню (такие, как “Справка”) полностью идентичны.
Теперь вопрос, как заставить два класса использовать одни и теже слоты без их дублирования в коде?
Пытался решить это через абстрактный класс, но тогда программа крушится с AttributeError.
Вот так я подсоединяю к меню разных окон необходимые слоты:
LoginWindow.py
class LoginWindow(QMainWindow): """ Некоторая часть программного кода опущена """ def __connect(self): self.connect(self.actions['manageAccounts'], SIGNAL('triggered()'), self.__manageAccounts) self.connect(self.actions['exit'], SIGNAL('triggered()'), SLOT('close()')) self.connect(self.actions['handbook'], SIGNAL('triggered()'), self.__handbook) self.connect(self.actions['reportBug'], SIGNAL('triggered()'), self.__reportBug) self.connect(self.actions['about'], SIGNAL('triggered()'), self.__about) self.connect(self.actions['aboutQt'], SIGNAL('triggered()'), self.__aboutQt)
class MainWindow(QMainWindow): """ Некоторая часть программного кода опущена """ def __connect(self): self.connect(self.actions['manageAccount'], SIGNAL('triggered()'), self.__manageAccount) self.connect(self.actions['logout'], SIGNAL('triggered()'), self.__logout) self.connect(self.actions['exit'], SIGNAL('triggered()'), SLOT('close()')) self.connect(self.actions['manageAccounts'], SIGNAL('triggered()'), self.__manageAccounts) self.connect(self.actions['shortcuts'], SIGNAL('triggered()'), self.__shortcuts) self.connect(self.actions['settings'], SIGNAL('triggered()'), self.__settings) self.connect(self.actions['handbook'], SIGNAL('triggered()'), self.__handbook) self.connect(self.actions['reportBug'], SIGNAL('triggered()'), self.__reportBug) self.connect(self.actions['about'], SIGNAL('triggered()'), self.__about) self.connect(self.actions['aboutQt'], SIGNAL('triggered()'), self.__aboutQt)
А вот этот повторяющийся фрагмент кода присутствует и в классе LoginWindow и в классе MainWindow:
def __about(self): """ SLOT. Display "About Feed2Blog" information dialog. """ AboutDialog(self) def __aboutQt(self): """ SLOT. Display "About Qt" information dialog. """ QMessageBox.aboutQt(self) def __handbook(self): """ SLOT. Display "Feed2Blog Handbook" HTML page. """ os.system('opera docs/index.html') def __manageAccounts(self): """ SLOT. Display "Manage Accounts" modal dialog. """ ManageAccountsDialog(self) def __reportBug(self): """ SLOT. Display "Report Bug" modal dialog. """ ReportBugDialog(self)
Заранее спасибо за помощь!