PyQt5.QtWidgets.QApplication: примеры (PYTHON)

Роль QApplication в создании приложений PyQt5 с графическим интерфейсом
Раздел: GUI, Фреймворки
PyQt5.QtWidgets.QApplication(argv: list): QApplication object

Описание функции QApplication

Класс QApplication из модуля PyQt5.QtWidgets управляет основным потоком выполнения и настройками приложения с графическим интерфейсом на основе виджетов. Этот класс отвечает за инициализацию, цикл обработки событий (event loop) и корректное завершение программы.

Использование класса происходит при запуске любого десктопного приложения с интерфейсом, построенным на виджетах Qt (QWidget, QMainWindow, QDialog и их наследниках). Без создания объекта QApplication графические элементы не будут работать.

Аргументы конструктора

Конструктор принимает список аргументов командной строки, обычно передаваемых в функцию sys.argv. Это позволяет Qt обрабатывать свои собственные аргументы (например, для настройки стиля или шрифтов).

  • argv (List[str]): Список строк, представляющих аргументы командной строки. Для большинства приложений передается sys.argv. Можно передать пустой список [], если обработка аргументов не требуется.

Возвращаемое значение

Конструктор возвращает экземпляр объекта QApplication. Сам по себе этот объект не возвращает данные в явном виде, но его методы управляют жизненным циклом приложения. Ключевой метод exec_() запускает главный цикл событий и возвращает код выхода (integer) после его завершения.

Краткие примеры использования

Базовый пример создания приложения с пустым главным окном.

import sys
from PyQt5.QtWidgets import QApplication, QWidget

if __name__ == '__main__':
    app = QApplication(sys.argv)  # Создание объекта приложения
    window = QWidget()            # Создание простого окна
    window.setWindowTitle('Пример 1')
    window.show()                 # Отображение окна
    sys.exit(app.exec_())         # Запуск цикла событий
(Откроется пустое окно с заголовком "Пример 1")

Пример создания приложения без передачи аргументов командной строки.

import sys
from PyQt5.QtWidgets import QApplication, QLabel

if __name__ == '__main__':
    # Пустой список аргументов
    app = QApplication([])
    label = QLabel('Привет, Qt!')
    label.show()
    sys.exit(app.exec_())
(Откроется окно с текстом "Привет, Qt!")

Похожие классы в PyQt/PySide

QGuiApplication (модуль PyQt5.QtGui). Управляет приложениями, использующими QML или интерфейс на основе QWindow, но без виджетов. Предпочтительнее для приложений, не использующих модуль QtWidgets.

QCoreApplication (модуль PyQt5.QtCore). Предназначен для консольных приложений или сервисов без графического интерфейса, но требующих цикла событий Qt (например, для работы с таймерами или сетью). Используется, когда GUI не нужен.

Аналоги в других языках программирования

Java (Swing/AWT): Класс JFrame или метод main с вызовом SwingUtilities.invokeLater. Отличие: в Java управление циклом событий часто скрыто.

// Java с Swing
import javax.swing.*;

public class Main {
    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            JFrame frame = new JFrame("Пример");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setSize(300, 200);
            frame.setVisible(true);
        });
    }
}

C# (Windows Forms): Класс Application с методом Run. Отличие: более тесная интеграция с ОС Windows.

// C# с Windows Forms
using System.Windows.Forms;

namespace WinFormsApp {
    static class Program {
        [STAThread]
        static void Main() {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1()); // Form1 - главная форма
        }
    }
}

JavaScript (Electron): Создание окна через new BrowserWindow в процессе main. Отличие: асинхронная модель и привязка к веб-технологиям.

// JavaScript/Electron (main process)
const { app, BrowserWindow } = require('electron');

function createWindow() {
    const win = new BrowserWindow({ width: 800, height: 600 });
    win.loadFile('index.html');
}

app.whenReady().then(createWindow);

Типичные ошибки

1. Создание нескольких экземпляров QApplication в одном процессе. Это приводит к нестабильной работе или краху приложения.

import sys
from PyQt5.QtWidgets import QApplication, QWidget

app1 = QApplication(sys.argv)  # Первый экземпляр
app2 = QApplication(sys.argv)  # ОШИБКА: второй экземпляр
window = QWidget()
window.show()
app1.exec_()
Обычно возникает ошибка: "QApplication: уже существует экземпляр приложения"
и последующее аварийное завершение.

2. Попытка создания или изменения виджетов до вызова app = QApplication(sys.argv). Виджеты требуют существующего объекта приложения.

from PyQt5.QtWidgets import QLabel

label = QLabel('Текст')  # ОШИБКА: QApplication еще не создан
print(label.text())
Может вызвать различные ошибки, например:
"QWidget: Must construct a QApplication before a QWidget"

3. Запуск цикла событий exec_() без предварительного вызова show() для главного окна. Окно не отобразится, и приложение "зависнет" в фоне.

Изменения в последних версиях

В актуальных версиях PyQt5 (на базе Qt 5) и PyQt6/PySide6 (на базе Qt 6) изменения в основном касаются переименования метода exec_() в exec() для соответствия стилю Python. В PyQt6 конструктор QApplication также стал принимать необязательный список аргументов, по умолчанию равный пустому списку.

Пример для PyQt6:

# PyQt6
import sys
from PyQt6.QtWidgets import QApplication, QWidget

app = QApplication([])  # sys.argv можно не передавать
window = QWidget()
window.show()
sys.exit(app.exec())    # Метод теперь называется exec(), а не exec_()

Расширенные примеры использования

Пример с обработкой аргументов командной строки для изменения стиля приложения.

Пример python
import sys
from PyQt5.QtWidgets import QApplication, QLabel, QVBoxLayout, QWidget
from PyQt5.QtCore import Qt

if __name__ == '__main__':
    # Передача аргументов, влияющих на стиль Qt
    # Например, запуск: python script.py -style fusion
    app = QApplication(sys.argv)

    # Проверка, был ли передан аргумент для стиля
    print("Аргументы приложения:", app.arguments())

    widget = QWidget()
    layout = QVBoxLayout()
    label1 = QLabel("Текст с выравниванием по центру")
    label1.setAlignment(Qt.AlignCenter)
    layout.addWidget(label1)

    label2 = QLabel("<b>Жирный</b> и <i>курсивный</i> текст через HTML")
    layout.addWidget(label2)
    widget.setLayout(layout)
    widget.setWindowTitle("Продвинутый пример")
    widget.show()

    sys.exit(app.exec_())
Откроется окно с двумя метками. Стиль окна может измениться в зависимости
от переданного аргумента (например, -style fusion). В консоль будут
выведены аргументы, которые видит QApplication.

Пример использования статических методов QApplication для получения информации о среде выполнения.

Пример python
import sys
from PyQt5.QtWidgets import QApplication, QMessageBox

if __name__ == '__main__':
    app = QApplication(sys.argv)

    # Получение глобальных настроек
    info_text = f"""
    Имя приложения: {QApplication.applicationName()}
    Версия приложения: {QApplication.applicationVersion()}
    Путь к исполняемому файлу: {QApplication.applicationFilePath()}
    Платформа: {QApplication.platformName()}
    Количество экранов: {len(app.screens())}
    """

    msg_box = QMessageBox()
    msg_box.setWindowTitle("Информация о приложении")
    msg_box.setText(info_text)
    msg_box.setIcon(QMessageBox.Information)
    msg_box.exec_()

    # Выход без запуска основного цикла, т.к. использован modal dialog
    sys.exit(0)
Появится диалоговое окно с технической информацией о запущенном приложении.

Пример создания приложения с использованием высокого DPI масштабирования (актуально для PyQt5 версии >= 5.6 или PyQt6).

Пример python
import sys
import os
# Включение поддержки высокого DPI до создания QApplication
os.environ["QT_ENABLE_HIGHDPI_SCALING"] = "1"
os.environ["QT_AUTO_SCREEN_SCALE_FACTOR"] = "1"

from PyQt5.QtWidgets import QApplication, QLabel
from PyQt5.QtCore import Qt

if __name__ == '__main__':
    app = QApplication(sys.argv)
    # Альтернативный способ для PyQt5
    app.setAttribute(Qt.AA_EnableHighDpiScaling, True)

    label = QLabel("Текст на экране с высоким DPI")
    label.setAlignment(Qt.AlignCenter)
    label.resize(400, 300)
    label.show()

    sys.exit(app.exec_())

питон PyQt5.QtWidgets.QApplication function comments

En
PyQt5.QtWidgets.QApplication Create Qt application