Найти - Пользователи
Полная версия: PyQt4. Два класса, одинаковые слоты - как реализовать?
Начало » GUI » PyQt4. Два класса, одинаковые слоты - как реализовать?
1
playpauseandstop
Доброго всем времени суток.

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

Заранее спасибо за помощь!
poltergeist
Конечно будет 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)
ZZZ
А вообще использовать QMainWindow в логинизаторе… микроскопом… ну там ещё про пушку чё-то было… Используй для таких вещей QDialog. Будет лучше.
playpauseandstop
poltergeist
Конечно будет AttributeError, ты же методы сделал типа приватными:) Это уже не проблема Qt, а проблема питона.
Не учел сей момент. Спасибо большое, что подсказали.

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

ZZZ
А вообще использовать QMainWindow в логинизаторе… микроскопом… ну там ещё про пушку чё-то было… Используй для таких вещей QDialog. Будет лучше.
Ну только ж учусь, пока еще не понял всех премудростей (мне просто казалось, что логинизатор такое себе главное окно с меню, центральным виджетом и статусбаром)
ZZZ
playpauseandstop
мне просто казалось, что логинизатор такое себе главное окно с меню, центральным виджетом и статусбаром
Зачем??? Для этого обычно хватает пары-тройки QLineEdit'ов/QComboBox'ов (login, password и, возможно, host с port'ом) и пары кнопок (Ok, Cancel). Для чего нужны статусбар и меню для меня – тайна покрытая мраком.
Ferroman
Для чего нужны статусбар и меню для меня – тайна покрытая мраком.
Эээ зачем тут бритвой размахивать, людей пужать :)
Но действительно - для логинизатора меню и статусбар - эт точно лишнее.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB