Учебники

27) PyQt Tutorial

Что такое PyQt?

PyQt — это связывание Python с открытым исходным кодом виджета-инструментария Qt, который также функционирует как кроссплатформенная среда разработки приложений. Qt является популярной средой C ++ для написания приложений с графическим интерфейсом для всех основных настольных, мобильных и встраиваемых платформ (поддерживает Linux, Windows, MacOS, Android, iOS, Raspberry Pi и другие).

PyQt — это бесплатное программное обеспечение, разработанное и поддерживаемое Riverbank Computing, компанией, базирующейся в Англии, тогда как Qt разрабатывается финской фирмой The Qt Company.

В этом уроке по PyQT вы узнаете:

Особенности PyQT

Вот Важные особенности PyQt:

PyQt состоит из более чем шести сотен классов, охватывающих ряд функций, таких как

  • Графический интерфейс пользователя
  • Базы данных SQL
  • Веб-инструментарий
  • Обработка XML
  • сетей

Эти функции можно комбинировать для создания расширенных пользовательских интерфейсов, а также автономных приложений. Многие крупные компании во всех отраслях используют Qt. Вот некоторые примеры: LG, Mercedes, AMD, Panasonic, Harman и т. Д.

Версии PyQt

PyQt доступен в двух редакциях: PyQt4 и PyQt5. PyQt4 предоставляет связующий код для привязки версий Qx 4.x и 5.x, в то время как PyQt5 обеспечивает привязку только для версий 5.x. В результате PyQt5 не имеет обратной совместимости с устаревшими модулями более старой версии. В этом уроке PyQt5 будет использоваться для демонстрации примеров. Помимо этих двух версий,

Riverbank Computing также предоставляет PyQt3D — привязки python для инфраструктуры Qt3D. Qt3D — это прикладная среда, используемая для создания систем моделирования в реальном времени с 2D / 3D рендерингом.

Как установить PyQt

Есть два способа установки PyQt.

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

Qt (произносится «мило») — сложная система, а кодовая база PyQt содержит в себе скомпилированный код C ++ и Python. В результате это сложный процесс для сборки и установки из исходного кода по сравнению с другими библиотеками Python. Тем не менее, вы можете легко установить PyQt5 с помощью колес.

Установка с колесами

Колеса — это новый стандартный формат упаковки и распространения Python. Проще говоря, колесо — это ZIP-архив со специальным названием и. расширение файла. Колеса могут быть установлены с помощью pip (менеджер пакетов Python), который включен по умолчанию в последние версии Python.

Итак, если у вас установлен Python 3.4 или более поздней версии, у вас уже есть pip. Однако, если вы используете более старую версию Python, вы должны загрузить и установить pip, прежде чем идти дальше. Вы можете найти инструкции для этого по этой ссылке: https://pypi.org/project/pip/ .

Чтобы установить PyQt5,

Шаг 1) Откройте командную строку или PowerShell на вашем компьютере с Windows.

Шаг 2) Введите следующее

 pip install PyQt5 

Этот шаг загрузит пакет PyQt5 whl (около 50 МБ) и установит его в вашей системе.

Шаг 1) Кроме того, вы также можете загрузить двоичный файл Windows для версии Python, установленной на вашем компьютере.

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

Основные концепции и программы PyQt

Теперь, когда вы успешно установили PyQt5 на свой компьютер, вы готовы писать приложения с графическим интерфейсом на python.

Давайте начнем с простого приложения, которое будет отображать пустое окно на вашем экране.

Запустите свой Python IDLE и введите следующее:

Программа 1

import sys
from PyQt5.QtWidgets import QApplication, QWidget
if __name__ == "__main__":
    app = QApplication(sys.argv)
    w = QWidget()
    w.resize(300,300)
    w.setWindowTitle(‘Guru99’)
    w.show()
    sys.exit(app.exec_())

Сохраните его как app.py (имя не имеет значения) и нажмите F5, чтобы запустить программу. Кроме того, просто дважды щелкните сохраненный файл, чтобы запустить приложение. Если вы все сделали правильно, откроется новое окно с заголовком Guru99, как показано ниже.

Большой! Работает. Это немного, но этого достаточно, чтобы понять основы. Теперь давайте посмотрим подробно, что делает каждая из строк в вашей программе.

from PyQt5.QtWidgets import QApplication, QWidget

Этот оператор импортирует все модули, необходимые для создания GUI, в текущее пространство имен. Модуль QtWidgets содержит все основные виджеты, которые вы будете использовать в этом руководстве.

app = QApplication(sys.argv)

Здесь вы создаете объект класса QApplication. Этот шаг необходим для PyQt5; каждое приложение пользовательского интерфейса должно создавать экземпляр QApplication в качестве своего рода точки входа в приложение. Если вы не создадите его, ошибки будут показаны.

sys.argv — это список параметров командной строки, которые вы можете передать приложению при запуске через оболочку или при автоматизации интерфейса.

В этом примере вы не передали аргументы QApplications. Следовательно, вы также можете заменить его приведенным ниже кодом и даже не импортировать модуль sys.

app = QApplication([])
w = QWidget()

Далее мы создаем объект класса QWidget. QWidget — это базовый класс всех объектов пользовательского интерфейса в Qt, и практически все, что вы видите в приложении, является виджетом. Это включает в себя диалоги, тексты, кнопки, панели и так далее. Функция, которая позволяет создавать сложные пользовательские интерфейсы, заключается в том, что виджеты могут быть вложенными, то есть вы можете иметь виджет внутри виджета, который находится внутри еще одного виджета. Вы увидите это в действии в следующем разделе.

w.resize(300,300)

Метод resize класса QWidget позволяет вам устанавливать размеры любого виджета. В этом случае вы изменили размер окна до 300 на 300 пикселей.

Здесь вы должны помнить, что виджеты могут быть вложены вместе, самый внешний виджет (т. Е. Виджет без родителя) называется окном.

w.setWindowTitle('Guru99')

Метод setWindowTitle () позволяет вам передать строку в качестве аргумента, который установит заголовок окна переданной вами строке. В этом примере в строке заголовка будет отображаться Guru99.

w.show()

show () просто отображает виджет на экране монитора.

sys.exit(app.exec_())

Метод app.exec_ () запускает цикл событий Qt / C ++. Как вы знаете, PyQt в основном написан на C ++ и использует механизм цикла событий для реализации параллельного выполнения. app.exec_ () передает управление Qt, который будет выходить из приложения только тогда, когда пользователь закроет его из графического интерфейса. Вот почему Ctrl + C не будет выходить из приложения, как в других программах Python. Поскольку Qt контролирует приложение, события Python не обрабатываются, пока мы не настроим их внутри приложения. Также обратите внимание, что у метода exec есть подчеркивание в его имени; это потому, что exec () уже был ключевым словом в python, а подчеркивание разрешает конфликт имен.

За пустыми окнами

В предыдущем разделе вы видели, как создать базовый виджет в Qt. Пришло время сделать несколько более сложных интерфейсов, с которыми пользователи могут по-настоящему взаимодействовать. Снова, запустите ваш IDLE и напишите следующее.

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QPushButton, QMessageBox

def dialog():
    mbox = QMessageBox()

    mbox.setText("Your allegiance has been noted")
    mbox.setDetailedText("You are now a disciple and subject of the all-knowing Guru")
    mbox.setStandardButtons(QMessageBox.Ok | QMessageBox.Cancel)
            
    mbox.exec_()

if __name__ == "__main__":
    app = QApplication(sys.argv)
    w = QWidget()
    w.resize(300,300)
    w.setWindowTitle('Guru99')
    
    label = QLabel(w)
    label.setText("Behold the Guru, Guru99")
    label.move(100,130)
    label.show()

    btn = QPushButton(w)
    btn.setText('Beheld')
    btn.move(110,150)
    btn.show()
    btn.clicked.connect(dialog)

    
    w.show()
    sys.exit(app.exec_())

Сохраните файл как appone.py или как угодно и нажмите F5, чтобы запустить программу. Если вы не допустили ошибок, IDLE откроет новое окно с текстом и кнопкой, как показано ниже.

  1. Как только вы нажмете кнопку в первом окне, откроется новое окно сообщения с текстом, который вы написали.
  2. Теперь вы можете нажать кнопку Скрыть детали / Показать детали, чтобы переключить видимость дополнительного текста.

Как вы можете видеть, поскольку мы не установили заголовок окна в окне сообщения, заголовок по умолчанию был предоставлен самим python.

Теперь, когда он работает, давайте взглянем на дополнительный код, который вы добавили в предыдущий пример.

from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QPushButton, QMessageBox

Это импортирует еще несколько виджетов, которые вы использовали в этом примере, а именно QLabel, QPushButton и QMessageBox.

def dialog():
    mbox = QMessageBox()

    mbox.setText("Your allegiance has been noted")
    mbox.setDetailedText("You are now a disciple and subject of the all-knowing Guru")
    mbox.setStandardButtons(QMessageBox.Ok | QMessageBox.Cancel)
            
    mbox.exec_()

Здесь вы определили метод с именем dialog, который создает виджет окна сообщения и устанавливает некоторый текст для кнопок и других полей.

Метод диалога вызывается из основного блока программы при нажатии кнопки в определенном виджете (в данном случае, btn PushButton). Событие щелчка, вызванное этой кнопкой, вызывает выполнение этой функции. Такая функция называется слотом в Qt, и вы узнаете больше о сигналах и слотах в следующих параграфах.

if __name__ == "__main__":
    app = QApplication(sys.argv)
    w = QWidget()
    w.resize(300,300)
    w.setWindowTitle('Guru99')

Это основной раздел приложения, и, как и в предыдущем примере, вы начинаете с создания экземпляра QApplication, за которым следует простой виджет, то есть экземпляр QWidget.

    label = QLabel(w)
    btn = QPushButton(w)

Вы добавили два новых виджета в это приложение: QLabel и QPushButton. QLabel используется для печати нередактируемого текста или заполнителей внутри виджета, тогда как QPushButton используется для создания нажимаемой кнопки.

Здесь важно отметить, что при создании объектов label и btn вы передаете объект окна (w) конструкторам QLabel и QPushButton. Вот как работает вложение в PyQt5. Чтобы создать виджет внутри другого виджета, вы передаете ссылку на родительский виджет в конструктор дочернего элемента.

label.move(100,130)
btn.move(110,150)

move () используется для установки позиции виджета относительно его родительского виджета. В первом случае метка будет перемещена на 100 пикселей слева и на 130 пикселей сверху окна.

Точно так же кнопка будет размещена на 110 пикселей слева и на 150 пикселей сверху окна. Этот пример является грубым способом достижения макетов и обычно не используется в производстве; это включено здесь только в учебных целях. Qt поддерживает различные макеты, которые вы детально увидите в следующих разделах этого руководства.

btn.clicked.connect(dialog)

Наконец, это пример сигналов и слотов в Qt. В приложениях на основе графического интерфейса функции выполняются на основе действий, выполняемых пользователем, таких как наведение на элемент или нажатие кнопки. Эти действия называются событиями . Напомним, что метод app.exec_ () передает управление в цикл обработки событий Qt . Для этого существует цикл событий: прослушивать события и выполнять действия в ответ.

Всякий раз, когда происходит событие, например, когда пользователь нажимает кнопку, соответствующий виджет Qt генерирует сигнал . Эти сигналы могут быть связаны с функциями Python (например, с функцией диалога в этом примере), так что функция выполняется при срабатывании сигнала. Эти функции называются слотами в Qt lingo.

Впоследствии основной синтаксис для запуска функции слота в ответ на сигнал от события выглядит следующим образом

 widget.signal.connect(slot) 

Это означает, что всякий раз, когда сигнал запускается виджетом , будет выполняться функция подключенного слота . Таким образом, Qt использует сигналы и слоты для связи между объектами и облегчения повторного использования и интерактивности компонентов.

Теперь, когда вы знаете, как вкладывать виджеты и реализовывать взаимодействия с помощью сигналов и слотов, вот список полезных виджетов и других классов, которые вы можете использовать в своих приложениях PyQt.

Компоненты и виджеты

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

Поэтому очень важно иметь общее представление о структуре PyQt5. В этом разделе вы увидите, как PyQt5 организован внутри, и узнаете о различных модулях, библиотеках и классах API, предоставляемых PyQt5.

Структура каталогов PyQt5

Это фундаментальные модули, используемые связыванием Qt в Python, в частности PyQt5.

  • Qt : Он объединяет все классы / модули, упомянутые ниже, в один модуль. Это значительно увеличивает объем памяти, используемой приложением. Однако управлять инфраструктурой проще, импортируя только один модуль.
  • QtCore : содержит основные неграфические классы, используемые другими модулями. Именно здесь реализуются цикл событий Qt, сигналы, возможность подключения к слотам и т. Д.
  • QtWidgets : содержит большинство виджетов, доступных в Pyqt5.
  • QtGui : содержит компоненты графического интерфейса и расширяет модуль QtCore.
  • QtNetwork : Содержит классы, используемые для реализации сетевого программирования через Qt. Он поддерживает TCP-серверы, TCP-сокеты, UDP-сокеты, обработку SSL, сетевые сеансы и поиск DNS.
  • QtMultimedia предоставляет низкоуровневую мультимедийную функциональность.
  • QtSql : реализует интеграцию базы данных для баз данных SQL. Поддерживает ODBC, MySQL, Oracle, SQLite и PostgreSQL.

PyQt5 Виджеты

Вот список наиболее часто используемых виджетов в PyQt5

  • QLineEdit : это поле ввода, которое позволяет пользователю вводить одну строку текста.
    line = QLineEdit()
  • QRadioButton : это поле ввода с выбираемой кнопкой, аналогичное переключателям в html.
    rad = QRadioButton("button title")
    rad.setChecked(True)  #to select the button by default.
    
  • QComboBox : используется для отображения выпадающего меню со списком выбираемых элементов.
    drop = QComboBox(w)
    drop.addItems(["item one", "item two", "item three"])
    
  • QCheckBox : отображает выбираемое квадратное поле перед меткой, которая отмечена, если выбрана, аналогично переключателям.
    check = QCheckBox("button title")
    
  • QMenuBar : отображает горизонтальную строку меню в верхней части окна. Вы можете добавлять только объекты класса QMenu в эту панель. Эти объекты QMenu могут дополнительно содержать строки, объекты QAction или другие объекты QMenu.
  • QToolBar : это горизонтальная панель или панель, которую можно перемещать в пределах окна. Может содержать кнопки и другие виджеты.
  • QTab : используется для разбиения содержимого окна на несколько страниц, к которым можно получить доступ через разные вкладки в верхней части виджета. Он состоит из двух разделов: панель вкладок и страница вкладок.
  • QScrollBar : используется для создания полос прокрутки, которые позволяют пользователю прокручивать вверх и вниз в пределах окна. Он состоит из подвижного ползунка, дорожки ползунка и двух кнопок для прокрутки ползунка вверх или вниз.
    scroll = QScrollBar()
  • QSplitter : Сплиттеры используются для разделения содержимого окна, чтобы виджеты были сгруппированы правильно и не выглядели загроможденными. QSplitter является одним из основных обработчиков макетов, доступных в PyQt5, и используется для разделения содержимого по горизонтали и вертикали.
  • QDock : виджет-док — это подокно с двумя свойствами:
    • Это может быть перемещено в главное окно и
    • Его можно закрепить за пределами родительского окна в другом месте на экране.

Макеты и Темы

В предыдущих примерах вы использовали только методы move () и resize () для установки позиций виджетов в вашем графическом интерфейсе.

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

  1. QBoxLayout
  2. QGridLayout

QBoxLayout

QBoxLayout используется для выравнивания дочерних виджетов макета в горизонтальной или вертикальной строке. Два класса интереса, которые наследуются от QBoxLayout:

  • QHBoxLayout: используется для выравнивания дочерних виджетов по горизонтали.
  • QVBoxLayout: используется для выравнивания дочерних виджетов по вертикали.

Например, так будут выглядеть три кнопки, выровненные по QHBoxLayout.

import sys
from PyQt5.QtWidgets import *

if __name__ == "__main__":

    app = QApplication([])
    w = QWidget()
    w.setWindowTitle("Musketeers")

    btn1 = QPushButton("Athos")
    btn2 = QPushButton("Porthos")
    btn3 = QPushButton("Aramis")

    hbox = QHBoxLayout(w)

    hbox.addWidget(btn1)
    hbox.addWidget(btn2)
    hbox.addWidget(btn3)

    w.show()

    sys.exit(app.exec_())

И вот как они будут выглядеть в QVBoxLayout.

import sys
from PyQt5.QtWidgets import *

if __name__ == "__main__":

    app = QApplication([])
    w = QWidget()
    w.setWindowTitle("Musketeers")

    btn1 = QPushButton("Athos")
    btn2 = QPushButton("Porthos")
    btn3 = QPushButton("Aramis")

    vb = QVBoxLayout(w)

    vb.addWidget(btn1)
    vb.addWidget(btn2)
    vb.addWidget(btn3)

    w.show()

    sys.exit(app.exec_())

Единственная функция, которая нуждается в каком-либо объяснении на данный момент, это метод addWidget (). Он используется для вставки виджетов в макет HBox или VBox. Он также используется в других макетах, где он принимает другое количество параметров, как вы увидите в следующем разделе. Виджеты появятся внутри макета в том порядке, в котором вы их вставляете.

QGridLayout

QGridLayout используется для создания интерфейсов, в которых виджеты расположены в виде сетки (например, матрицы или 2D-массива). Чтобы вставить элементы в сетку, вы можете использовать матричное представление, чтобы определить количество строк и столбцов в сетке, а также положение этих элементов.

Например, чтобы создать сетку 3 * 3 (то есть сетку с тремя строками и тремя столбцами), вы напишите следующий код:

Import sys
from PyQt5.QtWidgets import *

if __name__ == "__main__":
    app = QApplication([])

    w = QWidget()

    grid = QGridLayout(w)

    for i in range(3):
        for j in range(3):
            grid.addWidget(QPushButton("Button"),i,j)


    w.show()
    sys.exit(app.exec_())

Это будет вывод:

Метод addWidget () В макете сетки принимает следующие аргументы:

  • Объект виджета, который вы хотите добавить в сетку
  • X-координата объекта
  • Y-координата объекта
  • Разряд строки (по умолчанию = 0)
  • Col-span (по умолчанию = 0)

Чтобы лучше это понять, вы можете вручную вставить каждый виджет, как показано ниже

import sys
from PyQt5.QtWidgets import *

if __name__ == "__main__":
    app = QApplication([])

    w = QWidget()

    grid = QGridLayout(w)
    grid.addWidget(QPushButton("Button one"),0,0)
    grid.addWidget(QPushButton("Button two"),0,1)
    grid.addWidget(QPushButton("Button three"),1,0)
    grid.addWidget(QPushButton("Button four"),1,1)


    w.show()
    sys.exit(app.exec_())

Вот как будет выглядеть сетка:

Вы также можете передать параметры rowspan и colspan в addWidget (), чтобы охватить более одной строки или столбца.

Например,

 grid.addWidget(QPushButton("Button five"),2,0,1,0)

Это создаст кнопку, которая простирается на оба столбца.

Темы

PyQt5 поставляется с некоторыми встроенными темами, которые вы можете использовать в своих приложениях. Метод setStyle (), вызываемый в экземпляре QApplication, используется для установки определенной темы для вашего приложения.

Например, добавление следующей строки кода изменит тему вашего приложения по умолчанию на Fusion

app.setStyle("Fusion")

Вот как будет выглядеть предыдущий пример в Fusion Theme

Еще одна полезная функция для создания тем ваших приложений — это метод setPalette (). Вот код для изменения цвета различных виджетов с помощью setPalette ().

import sys
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import *
from PyQt5.QtGui import QPalette

if __name__ == "__main__":
    app = QApplication([])
    app.setStyle("Fusion")
    
    qp = QPalette()
    qp.setColor(QPalette.ButtonText, Qt.black)
    qp.setColor(QPalette.Window, Qt.black)
    qp.setColor(QPalette.Button, Qt.gray)
    app.setPalette(qp)

    w = QWidget()

    grid = QGridLayout(w)
    grid.addWidget(QPushButton("Button one"),0,0)
    grid.addWidget(QPushButton("Button two"),0,1)
    grid.addWidget(QPushButton("Button three"),1,0)
    grid.addWidget(QPushButton("Button four"),1,1)


    w.show()
    sys.exit(app.exec_())

Вот результат.

Чтобы использовать метод setPalette (), сначала необходимо определить палитру. Это делается путем создания объекта класса QPalette.

 qp = QPalette()

Обратите внимание, что класс QPalette принадлежит модулю QtGui, и вам нужно будет импортировать его, чтобы это работало. Создав объект QPalette, используйте метод setColor (), чтобы передать имя виджета, цвет которого вы хотите изменить, и цвет, который вы хотите установить.

 qp.setColor(QPalette.Window, Qt.black)

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

 app.setPalette(qp)

Это все, что вам нужно сделать, если вы хотите создать базовые темы для своего приложения. PyQt также позволяет вам использовать таблицы стилей для определения внешнего вида ваших виджетов. Если вы знакомы с CSS, вы можете легко определить расширенные стили для своего приложения, используя таблицы стилей Qt.

Резюме

  • PyQt — это привязка Python для инфраструктуры пользовательского интерфейса C ++, Qt.
  • PyQt4 и PyQt5 — две основные версии, разработанные Riverbank Computing.
  • Основными модулями платформы PyQt являются:
  1. Qt
  2. QtCore
  3. QtWidgets
  4. QtGui
  5. QtSql
  6. QtNetwork
  • PyQt поддерживает различные виджеты, такие как:
    1. Кнопки
    2. Текстовые метки
    3. Текстовые поля
    4. Радиокнопки и флажки
    5. Панели инструментов и строки меню
    6. Webkit
    7. Вкладки
    8. доки
  • В PyQt интерактивность реализована с использованием сигналов и слотов.
  • Событие это действие выполняется пользователем в графическом интерфейсе пользователя (например , нажатие кнопки).
  • Сигнал поднимается на соответствующий виджет , когда событие происходит на нем.
  • Слот является функцией , которая подключается к сигналу и выполняет при повышении сигнала.
  • PyQt имеет мощный механизм компоновки и поддерживает расширенный дизайн макета и управление им. Это две часто используемые схемы компоновки в PyQt:
    1. Макет коробки
    2. Макет сетки
  • PyQt позволяет создавать пользовательские темы для приложения с графическим интерфейсом и имеет встроенную поддержку таблиц стилей.
  • PyQt может использоваться для создания пользовательских интерфейсов, а также автономных приложений.
  •