Разница между подклассами QMainWindow и QApplication - PullRequest
0 голосов
/ 23 апреля 2020
Class Window (QMainWindow):
Class Window (QApplication):

Я попытался создать окно, в котором ни один из них не заметил изменений ... так что

1 Ответ

0 голосов
/ 24 апреля 2020

Вы практически спрашиваете что-то вроде этого:

В чем разница между подклассами list и подклассами int?

Хотя оба они наследуются от тот же класс ( QObject в вашем случае, python object для list и int), они делают совершенно разные вещи.

QApplication наследуется от QGuiApplication (который, в свою очередь, наследуется от QCoreApplication ).
Приложение Qt является ответственным за запуск и управление событием Qt l oop, и его создание обязательно для создания и взаимодействия со многими элементами Qt. Самое главное, QApplication всегда требуется для виджетов Qt (windows, кнопки и т. Д. c), чтобы они правильно отображались и позволяли полное взаимодействие с пользователем.

Когда вы запустите приложение (запустив его exec()), вы вводите его событие l oop. Это означает, что он будет ожидать любого события, поступающего от кода, пользователя или системы, и реагировать соответствующим образом. Это концепция события l oop: оно будет просто молча бездействовать , ожидая, пока что-то произойдет.

Например, если вы вызываете show() в QDialog, Qt создаст событие show, которое, в свою очередь, будет «отправлено» операционной системе, сообщая ему, что будет показано новое «окно»; система создаст окно, и обработчик этого окна будет известен Qt, который создаст «событие рисования», которое будет получено диалогом paintEvent: в этом методе окно будет фактически «нарисовано», и оно будет наконец показан пользователю. (Обратите внимание, что это огромное упрощение: на самом деле все гораздо сложнее, чем это, но это не является целью этого ответа).

QMainWindow наследует от QWidget, базового класса для всех объектов которые представляют элемент GUI в Qt.
Проще говоря, он сам по себе почти ничего не делает. Он реагирует только на события , которые отправляет приложение Qt: вышеупомянутые события рисования, а также события клавиатуры / мыши или системные запросы. Если ему отправлено paintEvent, оно «раскрасит» содержимое окна. Если щелкнуть по нему кнопкой мыши, он попытается отправить его в виджет, который существует в координатах этого события и т. Д. c.

Как вы можете видеть, эти классы делают совершенно разные вещи.
В заключение: существует огромная разница между подклассами QMainWindow или QApplication ... Поскольку их нет.
Все зависит от ваших потребностей, так как использование этих классов очень отличается, как между list и int.

Подклассы обычно выполняются только тогда, когда вам необходимо расширить или изменить функциональные возможности существующего класса. Если вам нужно расширить или изменить поведение виджета главного окна Qt, вы будете иметь подкласс QMainWindow. Если вам нужно расширить или изменить поведение приложения Qt, вы будете подклассом приложения Q [Core | Gui].

Возможный сценарий ios:

  • Я хочу создайте класс главного окна, который, при создании экземпляра, уже имеет меню с подменю «файл» и некоторые виджеты, так что я могу создать больше основных windows, и все они уже настроены с этим меню: подкласс QMainWindow
  • Мне нужно приложение, которое управляет несколькими основными windows, и я хочу отслеживать их, используя общий интерфейс для взаимодействия с ними (когда окно закрывается, откройте другое и т. Д. c): подкласс QApplication
  • Мне нужно только одно главное окно, но мне нужно переопределить множество его методов, и «мартышка» будет беспорядок: подкласс QMainWindow
  • Мне нужно отфильтровать события в приложении и сделать что-то с ними (например, есть несколько windows и диалогов, но я не хочу выходить из приложения, если все они закрыты, так как некоторые могут появиться через некоторое время или при некотором взаимодействии с пользователем): подкласс QApplication

Обратите внимание, что все перечисленные выше случаи могут теоретически быть достигнуты без создания подклассов и только с использованием анонимных функций, но это сделает ваш код менее аккуратным и, что наиболее важно, менее читаемым и отлаживаемым.

Наконец:

  1. учтите, что в большинстве случаев создание подклассов приложения Qt не требуется;
  2. оба класса наследуют от QObject, который является основой для большинства классов Qt: он предлагает поддержку для механизма сигнал / слот может взаимодействовать с событиями Qt или с приложением (если оно существует, не всем потомкам QObject требуется приложение Qt: приложение Qt является самим подклассом QObject);
  3. Вы должны внимательно изучить, как python классы работают и, в общем, что такое классы и экземпляры;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...