Форум сайта python.su
Доброго всем времени суток.
Только начинаю разбираться с 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)
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)
Отредактировано (Апрель 26, 2008 22:10:08)
Офлайн
Конечно будет AttributeError, ты же методы сделал типа приватными:) Это уже не проблема Qt, а проблема питона.
Tip: при добавлении action-а в меню, можно сразу указать вызываемый им метод, например:
…
menu_bar = QMenuBar()
help_menu = menu_bar.addMenu(u'help')
help_menu.addAction(u'aboutQt', self.aboutQt)
…
self.setMenuBar(menu_bar)
Офлайн
А вообще использовать QMainWindow в логинизаторе… микроскопом… ну там ещё про пушку чё-то было… Используй для таких вещей QDialog. Будет лучше.
Офлайн
poltergeistНе учел сей момент. Спасибо большое, что подсказали.
Конечно будет AttributeError, ты же методы сделал типа приватными:) Это уже не проблема Qt, а проблема питона.
poltergeistИ за этот tip большое спасибо. Слазил в документацию, убедился что есть куча способов вызвать addAction().
Tip: при добавлении action-а в меню, можно сразу указать вызываемый им метод
ZZZНу только ж учусь, пока еще не понял всех премудростей (мне просто казалось, что логинизатор такое себе главное окно с меню, центральным виджетом и статусбаром)
А вообще использовать QMainWindow в логинизаторе… микроскопом… ну там ещё про пушку чё-то было… Используй для таких вещей QDialog. Будет лучше.
Офлайн
playpauseandstopЗачем??? Для этого обычно хватает пары-тройки QLineEdit'ов/QComboBox'ов (login, password и, возможно, host с port'ом) и пары кнопок (Ok, Cancel). Для чего нужны статусбар и меню для меня – тайна покрытая мраком.
мне просто казалось, что логинизатор такое себе главное окно с меню, центральным виджетом и статусбаром
Офлайн
Для чего нужны статусбар и меню для меня – тайна покрытая мраком.Эээ зачем тут бритвой размахивать, людей пужать :)
Офлайн