Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » GUI
  • » PyQt4. Два класса, одинаковые слоты - как реализовать? [RSS Feed]

#1 Апрель 26, 2008 22:00:14

playpauseandstop
От:
Зарегистрирован: 2007-10-31
Сообщения: 77
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQt4. Два класса, одинаковые слоты - как реализовать?

Доброго всем времени суток.

Только начинаю разбираться с 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)
MainWindow.py
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)

Заранее спасибо за помощь!



Отредактировано (Апрель 26, 2008 22:10:08)

Офлайн

#2 Апрель 26, 2008 23:08:21

poltergeist
От:
Зарегистрирован: 2007-02-28
Сообщения: 522
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQt4. Два класса, одинаковые слоты - как реализовать?

Конечно будет 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)



Офлайн

#3 Апрель 26, 2008 23:22:11

ZZZ
От: Москва
Зарегистрирован: 2008-04-03
Сообщения: 2161
Репутация: +  26  -
Профиль   Адрес электронной почты  

PyQt4. Два класса, одинаковые слоты - как реализовать?

А вообще использовать QMainWindow в логинизаторе… микроскопом… ну там ещё про пушку чё-то было… Используй для таких вещей QDialog. Будет лучше.



Офлайн

#4 Апрель 27, 2008 11:04:15

playpauseandstop
От:
Зарегистрирован: 2007-10-31
Сообщения: 77
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQt4. Два класса, одинаковые слоты - как реализовать?

poltergeist
Конечно будет AttributeError, ты же методы сделал типа приватными:) Это уже не проблема Qt, а проблема питона.
Не учел сей момент. Спасибо большое, что подсказали.

poltergeist
Tip: при добавлении action-а в меню, можно сразу указать вызываемый им метод
И за этот tip большое спасибо. Слазил в документацию, убедился что есть куча способов вызвать addAction().

ZZZ
А вообще использовать QMainWindow в логинизаторе… микроскопом… ну там ещё про пушку чё-то было… Используй для таких вещей QDialog. Будет лучше.
Ну только ж учусь, пока еще не понял всех премудростей (мне просто казалось, что логинизатор такое себе главное окно с меню, центральным виджетом и статусбаром)



Офлайн

#5 Апрель 28, 2008 00:15:35

ZZZ
От: Москва
Зарегистрирован: 2008-04-03
Сообщения: 2161
Репутация: +  26  -
Профиль   Адрес электронной почты  

PyQt4. Два класса, одинаковые слоты - как реализовать?

playpauseandstop
мне просто казалось, что логинизатор такое себе главное окно с меню, центральным виджетом и статусбаром
Зачем??? Для этого обычно хватает пары-тройки QLineEdit'ов/QComboBox'ов (login, password и, возможно, host с port'ом) и пары кнопок (Ok, Cancel). Для чего нужны статусбар и меню для меня – тайна покрытая мраком.



Офлайн

#6 Апрель 29, 2008 14:11:24

Ferroman
От:
Зарегистрирован: 2006-11-16
Сообщения: 2759
Репутация: +  1  -
Профиль   Отправить e-mail  

PyQt4. Два класса, одинаковые слоты - как реализовать?

Для чего нужны статусбар и меню для меня – тайна покрытая мраком.
Эээ зачем тут бритвой размахивать, людей пужать :)
Но действительно - для логинизатора меню и статусбар - эт точно лишнее.

Офлайн

  • Начало
  • » GUI
  • » PyQt4. Два класса, одинаковые слоты - как реализовать?[RSS Feed]

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version