PyQt5 сигнал и слот простое объяснение кода

Я очень новичок в использовании PyQt и пытаюсь понять механизм слота сигнала. К сожалению, документация для PyQt часто приводит к страницам Qt, где синтаксис и параметры едва ли совпадают. Я пытаюсь выяснить 2 вещи в простом примере ниже.

1) QAction:: triggered() является функцией void, так как мы вызываем QAction::triggered.connect() для какого-либо объекта, который теоретически должен быть возвращен методом triggered().

2) А что такое "qApp". Я не знаю, что это за тип qApp или где он создан PyQt, но он кажется мне ниоткуда, только для того, чтобы его можно было использовать в удобное время.

Частично мое недоразумение, вероятно, связано с тем фактом, что реализация функций на C++ и python в Qt/PyQt - это не одно и то же, но мы должны понимать, что происходит без каких-либо документов на python.

import sys
from PyQt5.QtWidgets import QMainWindow, QAction, qApp, QApplication
from PyQt5.QtGui import QIcon


class Example(QMainWindow):

    def __init__(self):
        super().__init__()

        self.initUI()


    def initUI(self):

        exitAction = QAction(QIcon('exit24.png'), 'Exit', self)
        exitAction.setShortcut('Ctrl+Q')
        exitAction.triggered.connect(qApp.quit)

        self.toolbar = self.addToolBar('Exit')
        self.toolbar.addAction(exitAction)

        self.setGeometry(300, 300, 300, 200)
        self.setWindowTitle('Toolbar')
        self.show()


if __name__ == '__main__':

    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

1 ответ

Решение

1/: Синтаксис для подключения сигнала автоматически передает аргументы к выделенному обратному вызову. В вашем случае аргумента нет. Я упрощаю ваш код, чтобы показать вам механизм обратного вызова

2/: qApp является своего рода ярлыком для вашего экземпляра Qapplication. Вы можете заменить его своим экземпляром QApplication, как в следующем примере.

Извлечение из документации QApplication:

Объект QApplication доступен через функцию instance(), которая возвращает указатель, эквивалентный глобальному указателю qApp.

Глобальный указатель qApp ссылается на этот объект приложения. Должен быть создан только один объект приложения.

import sys
from PyQt5.QtWidgets import QMainWindow, QAction, qApp, QApplication

class Example(QMainWindow):
    def __init__(self):
        super(Example, self).__init__()
        exitAction = QAction('Exit', self)
        exitAction.triggered.connect(self.this_call)
        self.toolbar = self.addToolBar('Exit')
        self.toolbar.addAction(exitAction)
        self.show()

    def this_call(self):
        print('bye bye')
        app.quit()

if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())
Другие вопросы по тегам