PyQt в Python

PyQt — это мощная библиотека Python для создания графических интерфейсов пользователя (GUI), которую можно использовать для замены встроенного в Python Tkinter.

PyQt — это привязка Python для фреймворка Qt, широко используемая при разработке настольных приложений.

Qt — это кросс-платформенный фреймворк для разработки приложений на C++.

PyQt позволяет разработчикам на Python использовать библиотеку Qt для создания мощных GUI-приложений.

PyQt имеет следующие основные версии:

  • PyQt4: привязки на основе Qt4
  • PyQt5: привязки на основе Qt5
  • PyQt6: привязки на основе Qt6 (последняя версия)

Установка PyQt

Установите PyQt5 с помощью pip:

# 安装PyQt5
pip install PyQt5

# 安装Qt设计师和其他工具(可选)
pip install PyQt5-tools

Первая программа на PyQt

Создание простого окна

Ниже приведена базовая программа на PyQt, создающая пустое окно:

Пример

from PyQt5.QtWidgets import QApplication, QWidget

# Создать экземпляр приложения
app = QApplication([])

# Создать главное окно
window = QWidget()
window.setWindowTitle("My first PyQt program")
window.setGeometry(100, 100, 400, 300)  # (x, y, ширина, высота)

# Показать окно
window.show()

# Запустить приложение
app.exec_()

Объяснение кода

  1. QApplicationУправляет потоком управления и основными настройками приложений с графическим интерфейсом.
  2. QWidgetСамый базовый класс окна, от него наследуются все компоненты интерфейса.
  3. setWindowTitle()Устанавливает заголовок окна.
  4. setGeometry()Устанавливает положение и размер окна.
  5. show()Показывает окно.
  6. app.exec_()Запускает цикл обработки событий и ожидает взаимодействия с пользователем.

Типичное приложение PyQt состоит из следующих частей:

  1. Объект QApplicationКаждому приложению PyQt нужен экземпляр QApplication.
  2. Окна и виджетыКомпоненты пользовательского интерфейса.
  3. Цикл обработки событийЦикл, который обрабатывает пользовательский ввод и системные события.
  4. Обработчики событийФункции или методы, которые реагируют на события.

Пример

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
       
        # Задать заголовок и размер окна
        self.setWindowTitle("Моё первое приложение PyQt")
        self.setGeometry(100, 100, 400, 300)  # x, y, width, height
       
        # Создать кнопку
        self.button = QPushButton("Нажми меня", self)
        self.button.setGeometry(150, 150, 100, 30)
        self.button.clicked.connect(self.button_clicked)
       
    def button_clicked(self):
        print("Кнопка была нажата!")

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())


Часто используемые виджеты PyQt

Кнопка (QPushButton)

Пример

from PyQt5.QtWidgets import QPushButton

button = QPushButton("Нажми меня", window)
button.move(150, 150)  # Установить позицию кнопки

Метка (QLabel)

Пример

from PyQt5.QtWidgets import QLabel

label = QLabel("Привет, PyQt!", window)
label.move(100, 100)

Текстовое поле (QLineEdit)

Пример

from PyQt5.QtWidgets import QLineEdit

textbox = QLineEdit(window)
textbox.move(100, 50)

Подробнее о распространённых виджетах см.:https://www.example.com/python3/python-pyqt-widgets.html


Управление компоновкой (QVBoxLayout)

Использование менеджеров компоновки позволяет автоматически настраивать положение виджетов:

Пример

from PyQt5.QtWidgets import QVBoxLayout, QLabel, QPushButton

layout = QVBoxLayout()
layout.addWidget(QLabel("Имя пользователя"))
layout.addWidget(QLineEdit())
layout.addWidget(QPushButton("Вход"))
window.setLayout(layout)

Дополнительные материалы по управлению компоновкой см. здесь:https://www.example.com/python3/python-pyqt-layout.html


Механизм сигналов и слотов

PyQt используетSignalиSlotмеханизм обработки событий.

Механизм сигналов и слотов в PyQt — это основной механизм взаимодействия между объектами.

  • Сигнал: уведомление, испускаемое при возникновении определённого события.
  • Слот: функция или метод, реагирующий на сигналы.

Пример

from PyQt5.QtWidgets import QPushButton

def on_button_click():
    print("Кнопка была нажата!")

button = QPushButton("Нажми меня", window)
button.clicked.connect(on_button_click)  # Подключение сигнала и слота

Пользовательские сигналы

Пример

from PyQt5.QtCore import pyqtSignal, QObject

class MyEmitter(QObject):
    my_signal = pyqtSignal(str)  # Определение сигнала

emitter = MyEmitter()
emitter.my_signal.connect(lambda x: print(f"Получен сигнал: {x}"))
emitter.my_signal.emit("Привет")  # Отправить сигнал

Дополнительные материалы по управлению компоновкой см.:https://www.example.com/python3/python-pyqt-signals-and-slots.html


Использование Qt Designer

Qt Designer — это инструмент визуального проектирования, который позволяет перетаскивать виджеты для создания интерфейсов:

  • Запустите Designer (обычно находится в каталоге Lib\site-packages\qt5_applications\Qt\bin вашей установки Python)
  • Создайте интерфейс и сохраните его как.uiфайл
  • будет.uiПреобразовать файл в код Python:

    pyuic5 input.ui -o output.py

Используйте сгенерированный интерфейс в коде:

Пример

from PyQt5 import uic

# Загрузить файл интерфейса
Form, Window = uic.loadUiType("output.ui")

# Использовать интерфейс
app = QApplication(sys.argv)
window = Window()
form = Form()
form.setupUi(window)
window.show()
sys.exit(app.exec_())

Практика: простое приложение «Блокнот»

Дизайн интерфейса

Пример

import sys
from PyQt5.QtWidgets import (QApplication, QMainWindow, QTextEdit,
                            QAction, QFileDialog, QMessageBox)

class Notepad(QMainWindow):
    def __init__(self):
        super().__init__()
        self.initUI()
       
    def initUI(self):
        self.text_edit = QTextEdit(self)
        self.setCentralWidget(self.text_edit)
       
        self.create_actions()
        self.create_menus()
       
        self.setWindowTitle('Простой блокнот')
        self.setGeometry(100, 100, 800, 600)
       
    def create_actions(self):
        # Действия меню «Файл»
        self.new_action = QAction('Создать', self)
        self.new_action.setShortcut('Ctrl+N')
        self.new_action.triggered.connect(self.new_file)
       
        self.open_action = QAction('Открыть', self)
        self.open_action.setShortcut('Ctrl+O')
        self.open_action.triggered.connect(self.open_file)
       
        self.save_action = QAction('Сохранить', self)
        self.save_action.setShortcut('Ctrl+S')
        self.save_action.triggered.connect(self.save_file)
       
        self.exit_action = QAction('Выход', self)
        self.exit_action.setShortcut('Ctrl+Q')
        self.exit_action.triggered.connect(self.close)
       
        # Действия меню «Правка»
        self.copy_action = QAction('Копировать', self)
        self.copy_action.setShortcut('Ctrl+C')
        self.copy_action.triggered.connect(self.text_edit.copy)
       
        self.paste_action = QAction('Вставить', self)
        self.paste_action.setShortcut('Ctrl+V')
        self.paste_action.triggered.connect(self.text_edit.paste)
       
        self.cut_action = QAction('Вырезать', self)
        self.cut_action.setShortcut('Ctrl+X')
        self.cut_action.triggered.connect(self.text_edit.cut)
       
    def create_menus(self):
        menubar = self.menuBar()
       
        # Меню «Файл»
        file_menu = menubar.addMenu('Файл')
        file_menu.addAction(self.new_action)
        file_menu.addAction(self.open_action)
        file_menu.addAction(self.save_action)
        file_menu.addSeparator()
        file_menu.addAction(self.exit_action)
       
        # Меню правки
        edit_menu = menubar.addMenu('Правка')
        edit_menu.addAction(self.copy_action)
        edit_menu.addAction(self.paste_action)
        edit_menu.addAction(self.cut_action)
       
    def new_file(self):
        self.text_edit.clear()
       
    def open_file(self):
        filename, _ = QFileDialog.getOpenFileName(self, 'Открыть файл')
        if filename:
            try:
                with open(filename, 'r') as f:
                    self.text_edit.setText(f.read())
            except Exception as e:
                QMessageBox.warning(self, 'Ошибка', f'Не удалось открыть файл: {e}')
               
    def save_file(self):
        filename, _ = QFileDialog.getSaveFileName(self, 'Сохранить файл')
        if filename:
            try:
                with open(filename, 'w') as f:
                    f.write(self.text_edit.toPlainText())
            except Exception as e:
                QMessageBox.warning(self, 'Ошибка', f'Не удалось сохранить файл: {e}')

if __name__ == '__main__':
    app = QApplication(sys.argv)
    notepad = Notepad()
    notepad.show()
    sys.exit(app.exec_())


Основные виджеты PyQt5

Большинство виджетов находятся в PyQt5.QtWidgets.

Дополнительные функции (такие как мультимедиа, сеть) могут требовать других модулей (например, QtCore, QtGui, QtNetwork и т. д.).

QListView/QTableView/QTreeView необходимо использовать с моделью данных (например, QStandardItemModel) для большей гибкости.

Другие расширения установки:

pip install PyQtWebEngine  # 网页支持
pip install PyQtChart      # 图表支持
Категория виджетаНазвание виджетаМодульОписание
Базовые оконные виджетыQWidgetQtWidgetsБазовый класс для всех объектов пользовательского интерфейса, может использоваться как пустое окно или контейнер.
QMainWindowQtWidgetsКаркас главного окна, содержащий строку меню, панель инструментов, строку состояния и т. д.
QDialogQtWidgetsБазовый класс для диалогов, используется для всплывающих окон.
Управление компоновкойQVBoxLayoutQtWidgetsВертикальный менеджер компоновки
QHBoxLayoutQtWidgetsМенеджер горизонтальной компоновки
QGridLayoutQtWidgetsМенеджер сеточной компоновки
QFormLayoutQtWidgetsМенеджер компоновки формы (пары «метка + поле ввода»)
Классы кнопокQPushButtonQtWidgetsОбычная кнопка
QRadioButtonQtWidgetsРадиокнопка
QCheckBoxQtWidgetsФлажок
QToolButtonQtWidgetsКнопка панели инструментов (может иметь значок)
Виджеты вводаQLineEditQtWidgetsОднострочное поле ввода текста
QTextEditQtWidgetsМногострочный редактор форматированного текста (поддерживает HTML)
QPlainTextEditQtWidgetsМногострочный редактор простого текста
QSpinBoxQtWidgetsСчётчик (целое число)
QDoubleSpinBoxQtWidgetsСчётчик (число с плавающей запятой)
QComboBoxQtWidgetsВыпадающий список
QDateEditQtWidgetsПоле выбора даты
QTimeEditQtWidgetsПоле выбора времени
QDateTimeEditQtWidgetsПоле выбора даты и времени
QSliderQtWidgetsПолзунок (горизонтальный/вертикальный)
QDialQtWidgetsКруглая ручка управления
Виджеты отображенияQLabelQtWidgetsТекстовая/графическая метка
QLCDNumberQtWidgetsЦифровой ЖК-дисплей
QProgressBarQtWidgetsИндикатор выполнения
QStatusBarQtWidgetsСтрока состояния (обычно используется дляQMainWindow)
Классы контейнеровQGroupBoxQtWidgetsГрупповой блок (контейнер с заголовком)
QTabWidgetQtWidgetsКонтейнер вкладок
QStackedWidgetQtWidgetsСтековый контейнер (отображает один дочерний виджет за раз)
QScrollAreaQtWidgetsКонтейнер области прокрутки
QMdiAreaQtWidgetsОбласть MDI (интерфейс нескольких документов)
Список/Таблица/ДеревоQListWidgetQtWidgetsЭлемент управления списком (с управлением элементами)
QTreeWidgetQtWidgetsВиджет дерева
QTableWidgetQtWidgetsВиджет таблицы
QListViewQtWidgetsПредставление списка (требуется модель данных)
QTableViewQtWidgetsПредставление таблицы (требуется модель данных)
QTreeViewQtWidgetsПредставление дерева (требуется модель данных)
Меню/Панель инструментовQMenuBarQtWidgetsСтрока меню
QMenuQtWidgetsМеню (может содержать подменю и действия)
QToolBarQtWidgetsПанель инструментов
QActionQtWidgetsДействие (используется для пунктов меню, кнопок панели инструментов и т. д.)
ДиалогQFileDialogQtWidgetsДиалог выбора файла
QColorDialogQtWidgetsДиалог выбора цвета
QFontDialogQtWidgetsДиалог выбора шрифта
QInputDialogQtWidgetsДиалог ввода (текст, числа и т. д.)
QMessageBoxQtWidgetsОкно сообщения (предупреждение, ошибка, вопрос и т. д.)
Графическое представлениеQGraphicsViewQtWidgetsGraphics View Framework (для 2D-графики)
QGraphicsSceneQtWidgetsГрафическая сцена (для совместногоQGraphicsViewиспользования)
Другие функциональные компонентыQCalendarWidgetQtWidgetsВиджет календаря
QSplashScreenQtWidgetsЭкран-заставка
QSystemTrayIconQtWidgetsЗначок в системном трее
QWebEngineViewQtWebEngineWidgetsКомпонент веб-браузера (требуется отдельная установкаPyQtWebEngine)

Ресурсы для обучения

Другие расширения