PyQt5 - Краткое руководство

PyQt - это набор инструментов для виджетов с графическим интерфейсом. Это интерфейс Python дляQt, одна из самых мощных и популярных кроссплатформенных библиотек графического интерфейса. PyQt был разработан RiverBank Computing Ltd. Последнюю версию PyQt можно загрузить с ее официального сайта - riverbankcomputing.com

PyQt API - это набор модулей, содержащий большое количество классов и функций. В то время какQtCore модуль содержит функции без графического интерфейса для работы с файлом, каталогом и т. д., QtGuiмодуль содержит все графические элементы управления. Кроме того, есть модули для работы с XML.(QtXml), SVG (QtSvg), и SQL (QtSql), и т.д.

Список часто используемых модулей приведен ниже -

  • QtCore - Основные классы без графического интерфейса, используемые другими модулями

  • QtGui - Компоненты графического пользовательского интерфейса

  • QtMultimedia - Занятия по низкоуровневому мультимедийному программированию

  • QtNetwork - Уроки сетевого программирования

  • QtOpenGL - классы поддержки OpenGL

  • QtScript - Классы для оценки скриптов Qt

  • QtSql - Классы для интеграции базы данных с использованием SQL

  • QtSvg - Классы для отображения содержимого файлов SVG

  • QtWebKit - Классы для рендеринга и редактирования HTML

  • QtXml - Классы для обработки XML

  • QtWidgets - Классы для создания UI в классическом стиле рабочего стола

  • QtDesigner - Классы для расширения Qt Designer

Поддерживающие среды

PyQt совместим со всеми популярными операционными системами, включая Windows, Linux и Mac OS. Он имеет двойную лицензию, доступен как под GPL, так и под коммерческой лицензией. Последняя стабильная версияPyQt5-5.13.2.

Windows

Предоставляются колеса для 32-битной или 64-битной архитектуры, совместимые с Python версии 3.5 или новее. Рекомендуемый способ установки - использоватьPIP полезность -

pip3 install PyQt5

Чтобы установить инструменты разработки, такие как Qt Designer, для поддержки колес PyQt5, выполните следующую команду:

pip3 install pyqt5-tools

Вы также можете собрать PyQt5 в Linux / macOS из исходного кода www.riverbankcomputing.com/static/Downloads/PyQt5

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

PyQt5 не поддерживается в версиях Python ранее, чем v2.6.

PyQt5 не поддерживает метод connect () класса QObject для соединения между сигналом и слотом. Следовательно, использование больше не может быть реализовано -

QObject.connect(widget, QtCore.SIGNAL(‘signalname’), slot_function)

Определен только следующий синтаксис -

widget.signal.connect(slot_function)

Классы, определенные в предыдущем модуле QtGui, были распределены в QtGui, QtPrintSupport ан QtWidgets модули.

В новом классе QFileDialog getOpenFileNameAndFilter() метод заменяется на getOpenFileName(), getOpenFileNamesAndFilter() по getOpenFileNames() и getSaveFileNameAndFilter() по getSaveFileName(). Старые сигнатуры этих методов также изменились.

PyQt5 не имеет возможности определять класс, который является подклассом более чем одного класса Qt.

pyuic5 Утилита (для генерации кода Python из XML-файла конструктора) не поддерживает флаг --pyqt3-wrapper.

pyrcc5не поддерживает флаги -py2 и -py3. Вывод pyrcc5 совместим со всеми версиями Python v2.6 и новее.

PyQt5 всегда вызывает sip.setdestroyonexit() автоматически и вызывает деструктор C ++ всех обернутых экземпляров, которыми он владеет.

Создание простого приложения с графическим интерфейсом пользователя с использованием PyQt включает следующие шаги:

  • Импортируйте модули QtCore, QtGui и QtWidgets из пакета PyQt5.

  • Создайте объект приложения класса QApplication.

  • Объект QWidget создает окно верхнего уровня. Добавьте в него объект QLabel.

  • Установите заголовок ярлыка как «привет, мир».

  • Определите размер и положение окна методом setGeometry ().

  • Войдите в главный цикл приложения, app.exec_() метод.

Ниже приведен код для выполнения программы Hello World в PyQt.

import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
def window():
   app = QApplication(sys.argv)
   w = QWidget()
   b = QLabel(w)
   b.setText("Hello World!")
   w.setGeometry(100,100,200,50)
   b.move(50,20)
   w.setWindowTitle("PyQt5")
   w.show()
   sys.exit(app.exec_())
if __name__ == '__main__':
   window()

Приведенный выше код дает следующий вывод -

Также возможно разработать объектно-ориентированное решение из приведенного выше кода.

  • Импортируйте модули QtCore, QtGui и QtWidgets из пакета PyQt5.

  • Создайте объект приложения класса QApplication.

  • Объявить класс окна на основе класса QWidget

  • Добавьте объект QLabel и установите заголовок метки как «hello world».

  • Определите размер и положение окна методом setGeometry ().

  • Войдите в главный цикл приложения, app.exec_() метод.

Ниже приводится полный код объектно-ориентированного решения -

import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
class window(QWidget):
   def __init__(self, parent = None):
      super(window, self).__init__(parent)
      self.resize(200,50)
      self.setWindowTitle("PyQt5")
      self.label = QLabel(self)
      self.label.setText("Hello World")
      font = QFont()
      font.setFamily("Arial")
      font.setPointSize(16)
      self.label.setFont(font)
      self.label.move(50,20)
def main():
   app = QApplication(sys.argv)
   ex = window()
   ex.show()
   sys.exit(app.exec_())
if __name__ == '__main__':
   main()

PyQt APIпредставляет собой большой набор классов и методов. Эти классы определены более чем в 20 модулях.

Ниже приведены некоторые из часто используемых модулей -

Sr. No. Модули и описание
1

QtCore

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

2

QtGui

Компоненты графического пользовательского интерфейса

3

QtMultimedia

Занятия по низкоуровневому мультимедийному программированию

4

QtNetwork

Классы сетевого программирования

5

QtOpenGL

Классы поддержки OpenGL

6

QtScript

Классы для оценки скриптов Qt

7

QtSql

Классы для интеграции базы данных с использованием SQL

8

QtSvg

Классы для отображения содержимого файлов SVG

9

QtWebKit

Классы для рендеринга и редактирования HTML

10

QtXml

Классы для обработки XML

11

QtWidgets

Классы для создания пользовательских интерфейсов в классическом стиле рабочего стола.

12

QtDesigner

Классы для расширения Qt Designer

13

QtAssistant

Поддержка онлайн-справки

Инструменты разработки PyQt5 - это набор полезных утилит для разработки Qt. Ниже приведен избранный список таких утилит -

Sr. No. Название и описание инструмента
1

assistant

Инструмент документации Qt Assistant

2

pyqt5designer

Инструмент компоновки графического интерфейса Qt Designer

3

linguist

Инструмент перевода Qt Linguist

4

lrelease

компилировать файлы ts в файлы qm

5

pylupdate5

извлекать строки перевода и генерировать или обновлять файлы ts

6

qmake

Инструмент сборки программного обеспечения Qt

7

pyqt5qmlscene

Просмотрщик файлов QML

8

pyqmlviewer

Просмотрщик файлов QML

9

pyrcc5

Компилятор файла ресурсов Qt

10

pyuic5

Компилятор пользовательского интерфейса Qt для генерации кода из файлов пользовательского интерфейса

11

pyqmltestrunner

запуск модульных тестов на коде QML

12

qdbus

инструмент командной строки для вывода списка сервисов D-Bus

13

QDoc

генератор документации для программных проектов.

14

Qhelpgenerator

создание и просмотр файлов справки Qt.

15

qmlimportscanner

анализирует и сообщает об импорте QML

PyQt API содержит более 400 классов. ВQObjectкласс находится на вершине иерархии классов. Это базовый класс всех объектов Qt. Дополнительно,QPaintDevice class - это базовый класс для всех объектов, которые можно раскрашивать.

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

QWidget Класс, производный от классов QObject и QPaintDevice, является базовым классом для всех объектов пользовательского интерфейса. QDialog и QFrameклассы также являются производными от класса QWidget. У них есть своя собственная система подклассов.

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

Sr. No. Виджеты и описание
1

QLabel

Используется для отображения текста или изображения

2

QLineEdit

Позволяет пользователю вводить одну строку текста

3

QTextEdit

Позволяет пользователю вводить многострочный текст

4

QPushButton

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

5

QRadioButton

Позволяет выбрать один из нескольких вариантов

6

QCheckBox

Позволяет выбрать более одного варианта

7

QSpinBox

Позволяет увеличивать / уменьшать целочисленное значение

8

QScrollBar

Позволяет получить доступ к содержимому виджета за пределами апертуры дисплея

9

QSlider

Позволяет изменять граничное значение линейно.

10

QComboBox

Предоставляет раскрывающийся список элементов для выбора

11

QMenuBar

Горизонтальная полоса с объектами QMenu

12

QStatusBar

Обычно внизу QMainWindow предоставляет информацию о состоянии.

13

QToolBar

Обычно вверху QMainWindow или с плавающей точкой. Содержит кнопки действий

14

QListView

Предоставляет выбираемый список элементов в ListMode или IconMode

15

QPixmap

Внеэкранное представление изображения для отображения на объекте QLabel или QPushButton

16

QDialog

Модальное или немодальное окно, которое может возвращать информацию в родительское окно

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

На следующей диаграмме показана структура QMainWindow -

Установщик PyQt поставляется с инструментом построения графического интерфейса пользователя, который называется Qt Designer. Используя простой интерфейс перетаскивания, можно быстро создать графический интерфейс без написания кода. Однако это не IDE, такая как Visual Studio. Следовательно, Qt Designer не имеет возможности для отладки и сборки приложения.

Запустите приложение Qt Designer, которое входит в состав средств разработки и устанавливается в папку сценариев виртуальной среды.

Начните разработку графического интерфейса пользователя, выбрав Файл → Новое меню.

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

Созданная форма сохраняется как demo.ui. Этот файл пользовательского интерфейса содержит XML-представление виджетов и их свойств в дизайне. Этот дизайн переведен в эквивалент Python с помощью утилиты командной строки pyuic5. Эта утилита является оболочкой для модуля uic набора инструментов Qt. Использование pyuic5 выглядит следующим образом -

pyuic5 -x demo.ui -o demo.py

В приведенной выше команде ключ -x добавляет небольшой объем дополнительного кода к сгенерированному сценарию Python (из XML), так что он становится самоисполняемым автономным приложением.

if __name__ == "__main__":
   import sys
   app = QtGui.QApplication(sys.argv)
   Dialog = QtGui.QDialog()
   ui = Ui_Dialog()
   ui.setupUi(Dialog)
   Dialog.show()
   sys.exit(app.exec_())

Результирующий скрипт python выполняется, чтобы показать следующее диалоговое окно -

python demo.py

Пользователь может вводить данные в поля ввода, но нажатие кнопки «Добавить» не вызовет никаких действий, поскольку не связано с какой-либо функцией. Реакция на пользовательский ответ называетсяevent handling.

В отличие от приложения консольного режима, которое выполняется последовательно, приложение на основе графического интерфейса пользователя управляется событиями. Функции или методы выполняются в ответ на действия пользователя, такие как нажатие кнопки, выбор элемента из коллекции или щелчок мышью и т. Д., Называемыеevents.

Виджеты, используемые для построения интерфейса GUI, выступают в качестве источника таких событий. Каждый виджет PyQt, производный от класса QObject, предназначен для выдачи‘signal’в ответ на одно или несколько событий. Сам по себе сигнал не выполняет никаких действий. Вместо этого он «подключен» к‘slot’. Слот может быть любымcallable Python function.

Использование редактора сигналов / слотов Qt Designer

Сначала создайте простую форму с помощью элемента управления LineEdit и PushButton.

Желательно, чтобы при нажатии кнопки содержимое текстового поля стиралось. Для этого в виджете QLineEdit есть метод clear (). Следовательно, кнопкаclicked сигнал должен быть подключен к clear() метод текстового поля.

Для начала выберите Edit signal / slots в меню Edit (или нажмите F4). Затем выделите кнопку мышью и перетащите курсор в сторону текстового поля.

Когда мышь будет отпущена, отобразится диалоговое окно, показывающее сигналы кнопки и методы слота. Выберите щелкнувший сигнал и метод clear ()

Окно редактора сигналов / слотов в правом нижнем углу покажет результат -

Сохраните пользовательский интерфейс и код сборки и Python из файла пользовательского интерфейса, как показано в приведенном ниже коде -

pyuic5 -x signalslot.ui -o signalslot.py

Сгенерированный код Python будет иметь связь между сигналом и слотом с помощью следующего оператора:

self.pushButton.clicked.connect(self.lineEdit.clear)

Запустите signallot.py и введите текст в LineEdit. Текст будет очищен при нажатии кнопки.

Подключение сигнального разъема здания

Вместо использования Designer вы можете напрямую установить соединение сигнального слота, используя следующий синтаксис:

widget.signal.connect(slot_function)

Предположим, если функция должна вызываться при нажатии кнопки. Здесь сигнал clicked должен быть связан с вызываемой функцией. Это может быть достигнуто любым из следующих методов -

button.clicked.connect(slot_function)

пример

В следующем примере два объекта QPushButton (b1 и b2) добавляются в окно QDialog. Мы хотим вызывать функции b1_clicked () и b2_clicked () при нажатии кнопок b1 и b2 соответственно.

При щелчке по b1 сигнал clicked () подключается к функции b1_clicked () -

b1.clicked.connect(b1_clicked())

При щелчке по b2 сигнал clicked () подключается к функции b2_clicked ().

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

def window():
   app = QApplication(sys.argv)
   win = QDialog()
   b1 = QPushButton(win)
   b1.setText("Button1")
   b1.move(50,20)
   b1.clicked.connect(b1_clicked)
   
   b2 = QPushButton(win)
   b2.setText("Button2")
   b2.move(50,50)
   b2.clicked.connect(b2_clicked)
   
   win.setGeometry(100,100,200,100)

   win.setWindowTitle("PyQt5")
   win.show()
   sys.exit(app.exec_())

def b1_clicked():
   print ("Button 1 clicked")

def b2_clicked():
   print ("Button 2 clicked")

if __name__ == '__main__':
   window()

Приведенный выше код дает следующий вывод -

Вывод

Button 1 clicked
Button 2 clicked

Виджет с графическим интерфейсом пользователя можно разместить внутри окна контейнера, указав его абсолютные координаты в пикселях. Координаты указаны относительно размеров окна, определенного методом setGeometry ().

setGeometry () синтаксис

QWidget.setGeometry(xpos, ypos, width, height)

В следующем фрагменте кода окно верхнего уровня размером 300 на 200 пикселей отображается в позиции (10, 10) на мониторе.

import sys
from PyQt4 import QtGui

def window():
   app = QtGui.QApplication(sys.argv)
   w = QtGui.QWidget()
	
   b = QtGui.QPushButton(w)
   b.setText("Hello World!")
   b.move(50,20)
	
   w.setGeometry(10,10,300,200)
   w.setWindowTitle(“PyQt”)
   w.show()
   sys.exit(app.exec_())
	
if __name__ == '__main__':
   window()

А PushButton виджет добавляется в окно и размещается на 50 пикселей вправо и на 20 пикселей ниже верхнего левого угла окна.

Однако это абсолютное позиционирование не подходит по следующим причинам:

  • Положение виджета не меняется даже при изменении размера окна.

  • Внешний вид может быть неодинаковым на разных устройствах отображения с разным разрешением.

  • Изменить макет сложно, так как может потребоваться переработка всей формы.

PyQt API предоставляет классы макета для более элегантного управления позиционированием виджетов внутри контейнера. Преимущества менеджеров компоновки перед абсолютным позиционированием:

  • Размер виджетов внутри окна изменяется автоматически.

  • Обеспечивает единообразный внешний вид на устройствах отображения с разным разрешением.

  • Динамическое добавление или удаление виджета возможно без изменения дизайна.

Набор инструментов Qt определяет различные макеты, которые можно использовать с утилитой Qt Designer.

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

Sr. No. Классы и описание
1 QBoxLayout

Класс QBoxLayout выстраивает виджеты вертикально или горизонтально. Его производными классами являются QVBoxLayout (для размещения виджетов по вертикали) и QHBoxLayout (для размещения виджетов по горизонтали).

2 QGridLayout

Объект класса GridLayout представляет собой сетку ячеек, расположенных в строках и столбцах. Класс содержит метод addWidget (). Любой виджет можно добавить, указав количество строк и столбцов ячейки.

3 QFormLayout

QFormLayout - удобный способ создать форму с двумя столбцами, где каждая строка состоит из поля ввода, связанного с меткой. Как правило, левый столбец содержит метку, а правый столбец содержит поле ввода.

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

Старший Нет Виджеты и описание
1 QLabel

Объект QLabel действует как заполнитель для отображения нередактируемого текста или изображения или фильма в анимированном формате GIF. Его также можно использовать как мнемонический ключ для других виджетов.

2 QLineEdit

Объект QLineEdit - это наиболее часто используемое поле ввода. Он предоставляет поле, в которое можно ввести одну строку текста. Для ввода многострочного текста необходим объект QTextEdit.

3 QPushButton

В PyQt API объект класса QPushButton представляет собой кнопку, при нажатии которой можно запрограммировать вызов определенной функции.

4 QRadioButton

Объект класса QRadioButton представляет собой выбираемую кнопку с текстовой меткой. Пользователь может выбрать один из множества вариантов, представленных в форме. Этот класс является производным от класса QAbstractButton.

5 QCheckBox

Прямоугольное поле перед текстовой меткой появляется, когда объект QCheckBox добавляется в родительское окно. Как и QRadioButton, это кнопка, которую можно выбрать.

6 QComboBox

Объект QComboBox представляет собой раскрывающийся список элементов для выбора. На форме требуется минимум места на экране, необходимый для отображения только текущего выбранного элемента.

7 QSpinBox

Объект QSpinBox представляет пользователю текстовое поле, которое отображает целое число с кнопкой вверх / вниз справа.

8 Виджет и сигнал QSlider

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

9 QMenuBar, QMenu и QAction

Горизонтальная панель QMenuBar чуть ниже строки заголовка объекта QMainWindow зарезервирована для отображения объектов QMenu.

10 QToolBar

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

11 QInputDialog

Это предварительно настроенный диалог с текстовым полем и двумя кнопками, ОК и Отмена. Родительское окно собирает ввод в текстовое поле после того, как пользователь нажимает кнопку Ok или Enter.

12 QFontDialog

Другой часто используемый диалог, виджет выбора шрифта, визуально представляет собой класс QDialog. Результатом этого диалога является объект Qfont, который может использоваться родительским окном.

13 QFileDialog

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

14 QTab

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

15 QStacked

Функционирование QStackedWidget аналогично QTabWidget. Это также помогает эффективно использовать клиентскую область окна.

16 QSplitter

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

17 QDock

Закрепляемое окно - это подокно, которое может оставаться в плавающем состоянии или может быть прикреплено к главному окну в указанной позиции. Объект главного окна класса QMainWindow имеет область, зарезервированную для закрепляемых окон.

18 QStatusBar

Объект QMainWindow резервирует горизонтальную полосу внизу как строку состояния. Он используется для отображения постоянной или контекстной информации о состоянии.

19 QList

Класс QListWidget - это интерфейс на основе элементов для добавления или удаления элементов из списка. Каждый элемент в списке - это объект QListWidgetItem. ListWidget может быть настроен на выбор нескольких элементов.

20 QScrollBar

Элемент управления с полосой прокрутки позволяет пользователю получать доступ к частям документа, находящимся за пределами области просмотра. Он обеспечивает визуальный индикатор текущей позиции.

21 год QCalendar

Виджет QCalendar - это полезный элемент управления для выбора даты. Он обеспечивает просмотр по месяцам. Пользователь может выбрать дату с помощью мыши или клавиатуры, по умолчанию текущая дата.

А QDialogВиджет представляет собой окно верхнего уровня, в основном используемое для сбора ответа от пользователя. Его можно настроить какModal (где он блокирует свое родительское окно) или Modeless (диалоговое окно можно пропустить).

PyQt API имеет ряд предварительно настроенных виджетов Dialog, таких как InputDialog, FileDialog, FontDialog и т. Д.

пример

В следующем примере WindowModalityАтрибут диалогового окна определяет, является ли оно модальным или немодальным. Любую кнопку в диалоговом окне можно установить по умолчанию. Диалог отбрасываетсяQDialog.reject() , когда пользователь нажимает клавишу Escape.

PushButton в окне QWidget верхнего уровня при нажатии создает диалоговое окно. Диалоговое окно не имеет элементов управления сворачиванием и разворачиванием в строке заголовка.

Пользователь не может перевести это диалоговое окно в фоновый режим, поскольку его WindowModality имеет значение ApplicationModal.

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

def window():
   app = QApplication(sys.argv)
   w = QWidget()
   btn = QPushButton(w)
   btn.setText("Hello World!")
   btn.move(100,50)
   btn.clicked.connect(showdialog)
   w.setWindowTitle("PyQt Dialog demo")
   w.show()
   sys.exit(app.exec_())

def showdialog():
   dlg = QDialog()
   b1 = QPushButton("ok",dlg)
   b1.move(50,50)
   dlg.setWindowTitle("Dialog") 9. PyQt5 — QDialog Class
   dlg.setWindowModality(Qt.ApplicationModal)
   dlg.exec_()

if __name__ == '__main__':
   window()

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

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

Важные методы и перечисления, связанные с классом QMessageBox, приведены в следующей таблице -

Sr. No. Методы и описание
1

setIcon()

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

  • Question
  • Information
  • Warning
  • Critical
2

setText()

Задает отображаемый текст основного сообщения

3

setInformativeText()

Отображает дополнительную информацию

4

setDetailText()

В диалоговом окне отображается кнопка «Подробности». Этот текст появляется при нажатии на него

5

setTitle()

Отображает настраиваемый заголовок диалога

6

setStandardButtons()

Список стандартных кнопок для отображения. Каждая кнопка связана с

QMessageBox.Ok 0x00000400

QMessageBox.Open 0x00002000

QMessageBox.Save 0x00000800

QMessageBox.Cancel 0x00400000

QMessageBox.Close 0x00200000

QMessageBox.Yes 0x00004000

QMessageBox.No 0x00010000

QMessageBox.Abort 0x00040000

QMessageBox.Retry 0x00080000

QMessageBox.Ignore 0x00100000

7

setDefaultButton()

Устанавливает кнопку по умолчанию. При нажатии Enter издает сигнал щелчка.

8

setEscapeButton()

Устанавливает кнопку, которая будет считаться нажатой, если нажата клавиша выхода

пример

В следующем примере сигнал нажатия кнопки в окне верхнего уровня, подключенная функция отображает диалоговое окно окна сообщений.

msg = QMessageBox()
msg.setIcon(QMessageBox.Information)
msg.setText("This is a message box")
msg.setInformativeText("This is additional information")
msg.setWindowTitle("MessageBox demo")
msg.setDetailedText("The details are as follows:")

Функция setStandardButton () отображает нужные кнопки.

msg.setStandardButtons(QMessageBox.Ok | QMessageBox.Cancel)

Сигнал buttonClicked () связан с функцией слота, которая определяет заголовок источника сигнала.

msg.buttonClicked.connect(msgbtn)

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

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

def window():
   app = QApplication(sys.argv)
   w = QWidget()
   b = QPushButton(w)
   b.setText("Show message!")
   
   b.move(100,50)
   b.clicked.connect(showdialog)
   w.setWindowTitle("PyQt MessageBox demo")
   w.show()
   sys.exit(app.exec_())

def showdialog():
   msg = QMessageBox()
   msg.setIcon(QMessageBox.Information)
   
   msg.setText("This is a message box")
   msg.setInformativeText("This is additional information")
   msg.setWindowTitle("MessageBox demo")
   msg.setDetailedText("The details are as follows:")
   msg.setStandardButtons(QMessageBox.Ok | QMessageBox.Cancel)
   msg.buttonClicked.connect(msgbtn)

   retval = msg.exec_()

def msgbtn(i):
   print ("Button pressed is:",i.text())

if __name__ == '__main__':
   window()

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

Если вы нажмете кнопку Ok или Cancel в MessageBox, на консоли будет создан следующий вывод:

Button pressed is: OK
Button pressed is: Cancel

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

Один из способов одновременного отображения нескольких окон - создать их как независимые окна. Это называется SDI.(single Document Interface). Это требует больше ресурсов памяти, так как каждое окно может иметь свою собственную систему меню, панель инструментов и т. Д.

MDI (Multiple Document Interface)приложения потребляют меньше ресурсов памяти. Вспомогательные окна располагаются внутри основного контейнера относительно друг друга. Виджет контейнера называетсяQMdiArea.

Виджет QMdiArea обычно занимает центральный виджет объекта QMainWondow. Дочерние окна в этой области являются экземплярамиQMdiSubWindowкласс. Можно установить любой QWidget как внутренний виджет объекта subWindow. Подокна в области MDI могут быть расположены каскадом или мозаикой.

В следующей таблице перечислены важные методы класса QMdiArea и класса QMdiSubWindow.

Sr. No. Методы и описание
1

addSubWindow()

Добавляет виджет как новое подокно в области MDI

2

removeSubWindow()

Удаляет виджет, который является внутренним виджетом подокна

3

setActiveSubWindow()

Активирует подокно

4

cascadeSubWindows()

Располагает подокна в MDiArea каскадно

5

tileSubWindows()

Располагает подокна в MDiArea мозаичным способом

6

closeActiveSubWindow()

Закрывает активное подокно

7

subWindowList()

Возвращает список подокон в области MDI.

8

setWidget()

Устанавливает QWidget как внутренний виджет экземпляра QMdiSubwindow

Объект QMdiArea испускает сигнал subWindowActivated (), тогда как сигнал windowStateChanged () испускает объект QMdisubWindow.

пример

В следующем примере окно верхнего уровня, состоящее из QMainWindow, имеет меню и MdiArea.

self.mdi = QMdiArea()
self.setCentralWidget(self.mdi)
bar = self.menuBar()
file = bar.addMenu("File")

file.addAction("New")
file.addAction("cascade")
file.addAction("Tiled")

Сигнал Triggered () меню связан с функцией windowaction ().

file.triggered[QAction].connect(self.windowaction)

Новое действие меню добавляет подокно в область MDI с заголовком, к которому добавляется порядковый номер.

MainWindow.count = MainWindow.count+1
sub = QMdiSubWindow()
sub.setWidget(QTextEdit())
sub.setWindowTitle("subwindow"+str(MainWindow.count))
self.mdi.addSubWindow(sub)
sub.show()

Каскадные и мозаичные кнопки меню упорядочивают отображаемые в данный момент подокна в каскадном и мозаичном порядке соответственно.

Полный код выглядит следующим образом -

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

class MainWindow(QMainWindow):
   count = 0

   def __init__(self, parent = None):
      super(MainWindow, self).__init__(parent)
      self.mdi = QMdiArea()
      self.setCentralWidget(self.mdi)
      bar = self.menuBar()

      file = bar.addMenu("File")
      file.addAction("New")
      file.addAction("cascade")
      file.addAction("Tiled")
      file.triggered[QAction].connect(self.windowaction)
      self.setWindowTitle("MDI demo")

   def windowaction(self, q):
      print ("triggered")
   
      if q.text() == "New":
         MainWindow.count = MainWindow.count+1
         sub = QMdiSubWindow()
         sub.setWidget(QTextEdit())
         sub.setWindowTitle("subwindow"+str(MainWindow.count))
         self.mdi.addSubWindow(sub)
         sub.show()

      if q.text() == "cascade":
         self.mdi.cascadeSubWindows()

      if q.text() == "Tiled":
         self.mdi.tileSubWindows()

def main():
   app = QApplication(sys.argv)
   ex = MainWindow()
   ex.show()
   sys.exit(app.exec_())

if __name__ == '__main__':
   main()

Выполните приведенный выше код и три окна в каскадной и мозаичной формации -

Предоставление drag and dropочень интуитивно понятен для пользователя. Он присутствует во многих настольных приложениях, где пользователь может копировать или перемещать объекты из одного окна в другое.

Передача данных перетаскиванием на основе MIME основана на QDrag класс. QMimeDataобъекты связывают данные с их соответствующим типом MIME. Он сохраняется в буфере обмена, а затем используется в процессе перетаскивания.

Следующие функции класса QMimeData позволяют удобно обнаруживать и использовать тип MIME.

Тестер Геттер Сеттер Типы MIME
hasText () текст() setText () текст / простой
hasHtml () html () setHtml () текст / html
hasUrls () URL-адреса () setUrls () текст / список URI
hasImage () imageData () setImageData () изображение / *
hasColor () colorData () setColorData () приложение / x-color

Многие объекты QWidget поддерживают перетаскивание. Те, которые позволяют перетаскивать свои данные, имеют setDragEnabled (), для которого должно быть установлено значение true. С другой стороны, виджеты должны реагировать на события перетаскивания, чтобы сохранить перетаскиваемые в них данные.

  • DragEnterEvent предоставляет событие, которое отправляется в целевой виджет, когда в него входит действие перетаскивания.

  • DragMoveEvent используется, когда выполняется перетаскивание.

  • DragLeaveEvent генерируется, когда действие перетаскивания покидает виджет.

  • DropEvent, с другой стороны, происходит, когда сброс завершен. Предлагаемое мероприятие действие может быть принято или отклонено условно.

пример

В следующем коде DragEnterEventпроверяет, содержат ли данные MIME события текст. Если да, действие, предложенное событием, принимается, и текст добавляется как новый элемент в ComboBox.

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

class combo(QComboBox):
   def __init__(self, title, parent):
      super(combo, self).__init__( parent)
      self.setAcceptDrops(True)

   def dragEnterEvent(self, e):
      print (e)

      if e.mimeData().hasText():
         e.accept()
      else:
         e.ignore()

   def dropEvent(self, e):
      self.addItem(e.mimeData().text())

class Example(QWidget):
   def __init__(self):
      super(Example, self).__init__()

      self.initUI()

   def initUI(self):
      lo = QFormLayout()
      lo.addRow(QLabel("Type some text in textbox and drag it into combo box"))
   
      edit = QLineEdit()
      edit.setDragEnabled(True)
      com = combo("Button", self)
      lo.addRow(edit,com)
      self.setLayout(lo)
      self.setWindowTitle('Simple drag and drop')
def main():
   app = QApplication(sys.argv)
   ex = Example()
   ex.show()
   app.exec_()

if __name__ == '__main__':
   main()

Приведенный выше код дает следующий вывод -

Библиотека PyQt5 содержит QtSqlмодуль. Это сложная система классов для связи со многими базами данных на основе SQL. этоQSqlDatabaseобеспечивает доступ через объект Connection. Ниже приведен список доступных в настоящее время драйверов SQL -

Sr. No. Тип и описание драйвера
1

QDB2

IBM DB2

2

QIBASE

Драйвер Borland InterBase

3

QMYSQL

Драйвер MySQL

4

QOCI

Драйвер интерфейса вызова Oracle

5

QODBC

Драйвер ODBC (включает Microsoft SQL Server)

6

QPSQL

Драйвер PostgreSQL

7

QSQLITE

SQLite версии 3 или выше

8

QSQLITE2

SQLite версии 2

пример

В этой главе соединение с базой данных SQLite устанавливается с использованием статического метода -

db = QtSql.QSqlDatabase.addDatabase('QSQLITE')
db.setDatabaseName('sports.db')

Другие методы класса QSqlDatabase следующие:

Sr. No. Методы и описание
1

setDatabaseName()

Устанавливает имя базы данных, с которой ищется соединение

2

setHostName()

Устанавливает имя хоста, на котором установлена ​​база данных

3

setUserName()

Задает имя пользователя для подключения

4

setPassword()

Устанавливает пароль объекта подключения, если есть

5

commit()

Фиксирует транзакции и возвращает истину в случае успеха

6

rollback()

Откатывает транзакцию базы данных

7

close()

Закрывает соединение

QSqlQueryclass имеет функциональные возможности для выполнения и управления командами SQL. Могут выполняться запросы SQL как DDL, так и DML. Первый шаг - создать базу данных SQlite, используя следующие инструкции:

db = QSqlDatabase.addDatabase('QSQLITE')
db.setDatabaseName('sportsdatabase.db')

Затем получите объект Query с QSqlQuery() метод и вызвать его наиболее важный метод exec_ (), который принимает в качестве аргумента строку, содержащую SQL-оператор, который нужно выполнить.

query = QtSql.QSqlQuery()
query.exec_("create table sportsmen(id int primary key, " "firstname varchar(20), lastname varchar(20))")

Следующий сценарий создает базу данных SQLite sports.db с таблицей спортсменов, заполненной пятью записями.

import sys
from PyQt5.QtSql import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *

def createDB():
   db = QSqlDatabase.addDatabase('QSQLITE')
   db.setDatabaseName('sportsdatabase.db')

   if not db.open():
      msg = QMessageBox()
      msg.setIcon(QMessageBox.Critical)
      msg.setText("Error in Database Creation")
      retval = msg.exec_()
      return False
   query = QSqlQuery()

   query.exec_("create table sportsmen(
      id int primary key, ""firstname varchar(20), lastname varchar(20))")

   query.exec_("insert into sportsmen values(101, 'Roger', 'Federer')")
   query.exec_("insert into sportsmen values(102, 'Christiano', 'Ronaldo')")
   query.exec_("insert into sportsmen values(103, 'Ussain', 'Bolt')")
   query.exec_("insert into sportsmen values(104, 'Sachin', 'Tendulkar')")
   query.exec_("insert into sportsmen values(105, 'Saina', 'Nehwal')")
   return True

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

Чтобы убедиться, что база данных SQLite создана с указанными выше записями, добавленными в нее в таблице спортсменов, используйте утилиту SQLite Gui под названием SQLiteStudio.

QSqlTableModelКласс в PyQt - это интерфейс высокого уровня, который предоставляет редактируемую модель данных для чтения и записи записей в одной таблице. Эта модель используется для заполненияQTableViewобъект. Он представляет пользователю прокручиваемый и редактируемый вид, который может быть помещен в любое окно верхнего уровня.

Объект QSqlTableModel объявляется следующим образом:

model = QtSql.QSqlTableModel()

Его стратегия редактирования может быть установлена ​​на любую из следующих:

QSqlTableModel.OnFieldChange Все изменения вступят в силу немедленно
QSqlTableModel.OnRowChange Изменения будут применены, когда пользователь выберет другую строку
QSqlTableModel.OnManualSubmit Все изменения будут кэшироваться до тех пор, пока не будет вызван submitAll () или revertAll ()

пример

В следующем примере таблица спортсмена используется в качестве модели, а стратегия задана как -

model.setTable('sportsmen') 
model.setEditStrategy(QtSql.QSqlTableModel.OnFieldChange)
   model.select()

Класс QTableView является частью структуры Модель / Представление в PyQt. Объект QTableView создается следующим образом -

view = QtGui.QTableView()
view.setModel(model)
view.setWindowTitle(title)
return view

Этот объект QTableView и два виджета QPushButton добавляются в окно QDialog верхнего уровня. Сигнал Clicked () кнопки добавления связан с addrow (), который выполняет insertRow () для таблицы модели.

button.clicked.connect(addrow)
def addrow():
   print model.rowCount()
   ret = model.insertRows(model.rowCount(), 1)
   print ret

Слот, связанный с кнопкой удаления, выполняет лямбда-функцию, которая удаляет строку, выбранную пользователем.

btn1.clicked.connect(lambda: model.removeRow(view1.currentIndex().row()))

Полный код выглядит следующим образом -

import sys
from PyQt5.QtSql import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *

def initializeModel(model):
   model.setTable('sportsmen')
   model.setEditStrategy(QSqlTableModel.OnFieldChange)
   model.select()
   model.setHeaderData(0, Qt.Horizontal, "ID")
   model.setHeaderData(1, Qt.Horizontal, "First name")
   model.setHeaderData(2, Qt.Horizontal, "Last name")

def createView(title, model):
   view = QTableView()
   view.setModel(model)
   view.setWindowTitle(title)
   return view

def addrow():
   print (model.rowCount())
   ret = model.insertRows(model.rowCount(), 1)
   print (ret)

def findrow(i):
   delrow = i.row()

if __name__ == '__main__':
   app = QApplication(sys.argv)
   db = QSqlDatabase.addDatabase('QSQLITE')
   db.setDatabaseName('sportsdatabase.db')
   model = QSqlTableModel()
   delrow = -1
   initializeModel(model)

   view1 = createView("Table Model (View 1)", model)
   view1.clicked.connect(findrow)

   dlg = QDialog()
   layout = QVBoxLayout()
   layout.addWidget(view1)

   button = QPushButton("Add a row")
   button.clicked.connect(addrow)
   layout.addWidget(button)

   btn1 = QPushButton("del a row")
   btn1.clicked.connect(lambda: model.removeRow(view1.currentIndex().row()))
   layout.addWidget(btn1)

   dlg.setLayout(layout)
   dlg.setWindowTitle("Database Demo")
   dlg.show()
   sys.exit(app.exec_())

Приведенный выше код дает следующий вывод -

Попробуйте добавить и удалить несколько записей и вернуться в SQLiteStudio, чтобы подтвердить транзакции.

Все QWidgetклассы в PyQt являются подклассами класса QPaintDevice. АQPaintDeviceпредставляет собой абстракцию двухмерного пространства, которое можно нарисовать с помощью QPainter. Размеры устройства рисования измеряются в пикселях, начиная с левого верхнего угла.

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

Художник активируется вызовом begin() метод, в то время как end()метод деактивирует его. Между ними желаемый узор наносится подходящими методами, указанными в следующей таблице.

Sr. No. Методы и описание
1

begin()

Начинает рисование на целевом устройстве

2

drawArc()

Рисует дугу между начальным и конечным углом

3

drawEllipse()

Рисует эллипс внутри прямоугольника

4

drawLine()

Рисует линию с указанными координатами конечной точки

5

drawPixmap()

Извлекает растровое изображение из файла изображения и отображает его в указанной позиции

6

drwaPolygon()

Рисует многоугольник с использованием массива координат

7

drawRect()

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

8

drawText()

Отображает текст в заданных координатах

9

fillRect()

Заполняет прямоугольник параметром QColor

10

setBrush()

Устанавливает стиль кисти для рисования

11

setPen()

Устанавливает цвет, размер и стиль пера, который будет использоваться для рисования

пример

В следующем коде используются различные методы рисования PyQt.

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

class Example(QWidget):
   def __init__(self):
      super(Example, self).__init__()
      self.initUI()

   def initUI(self):
      self.text = "hello world"
      self.setGeometry(100,100, 400,300)
      self.setWindowTitle('Draw Demo')
      self.show()

   def paintEvent(self, event):
      qp = QPainter()
      qp.begin(self)
      qp.setPen(QColor(Qt.red))
      qp.setFont(QFont('Arial', 20))
      qp.drawText(10,50, "hello Python")
      qp.setPen(QColor(Qt.blue))
      qp.drawLine(10,100,100,100)
      qp.drawRect(10,150,150,100)
      qp.setPen(QColor(Qt.yellow))
      qp.drawEllipse(100,50,100,50)
      qp.drawPixmap(220,10,QPixmap("pythonlogo.png"))
      qp.fillRect(20,175,130,70,QBrush(Qt.SolidPattern))
      qp.end()

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

if __name__ == '__main__':
   main()

Приведенный выше код дает следующий вывод -

В этой главе мы изучим константы стиля кисти.

Константы стиля кисти

Ниже приведены константы стиля кисти -

Qt.NoBrush Нет рисунка кисти
Qt.SolidPattern Равномерный цвет
Qt.Dense1Pattern Чрезвычайно плотный рисунок кисти
Qt.HorPattern Горизонтальные линии
Qt.VerPattern Вертикальные линии
Qt.CrossPattern Пересечение горизонтальных и вертикальных линий
Qt.BDiagPattern Обратные диагональные линии
Qt.FDiagPattern Прямые диагональные линии
Qt.DiagCrossPattern Пересечение диагональных линий

Предопределенные стили QColor

Ниже приведены предопределенные стили QColor -

Qt.NoBrush Нет рисунка кисти
Qt.SolidPattern Равномерный цвет
Qt.Dense1Pattern Чрезвычайно плотный рисунок кисти
Qt.HorPattern Горизонтальные линии
Qt.VerPattern Вертикальные линии
Qt.CrossPattern Пересечение горизонтальных и вертикальных линий
Qt.BDiagPattern Обратные диагональные линии
Qt.FDiagPattern Прямые диагональные линии
Qt.DiagCrossPattern Пересечение диагональных линий

Предопределенные объекты QColor

Ниже приведены предопределенные объекты QColor -

Qt.white
Qt.black
Qt.red
Qt.darkRed
Qt.green
Qt.darkGreen
Qt.blue
Qt.cyan
Qt.magenta
Qt.yellow
Qt.darkYellow
Qt.gray

В QClipboardКласс обеспечивает доступ к общесистемному буферу обмена, который предлагает простой механизм для копирования и вставки данных между приложениями. Его действие похоже наQDrag class и использует похожие типы данных.

Класс QApplication имеет статический метод clipboard()который возвращает ссылку на объект буфера обмена. Любой тип MimeData можно скопировать в буфер обмена или вставить из него.

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

Sr. No. Методы и описание
1

clear()

Очищает содержимое буфера обмена

2

setImage()

Копирует QImage в буфер обмена

3

setMimeData()

Устанавливает данные MIME в буфер обмена

4

setPixmap()

Копирует объект Pixmap в буфер обмена

5

setText()

Копирует QString в буфер обмена

6

text()

Извлекает текст из буфера обмена

Сигнал, связанный с объектом буфера обмена -

Sr. No. Метод и описание
1

dataChanged()

При изменении данных буфера обмена

пример

В следующем примере два объекта TextEdit и две кнопки добавляются в окно верхнего уровня.

Для начала создается объект буфера обмена. Метод Copy () объекта textedit копирует данные в системный буфер обмена. При нажатии кнопки «Вставить» данные из буфера обмена выбираются и вставляются в другой объект textedit.

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

class Example(QWidget):
   def __init__(self):
      super(Example, self).__init__()

      self.initUI()

   def initUI(self):
      hbox = QVBoxLayout()
      self.edit1=QTextEdit()
      hbox.addWidget(self.edit1)
      self.btn1=QPushButton("Copy")
      hbox.addWidget(self.btn1)
      self.edit2=QTextEdit()
      self.btn2=QPushButton("Paste")
      hbox.addWidget(self.edit2)
      hbox.addWidget(self.btn2)
      self.btn1.clicked.connect(self.copytext)
      self.btn2.clicked.connect(self.pastetext)
      self.setLayout(hbox)
      
      self.setGeometry(300, 300, 300, 200)
      self.setWindowTitle('Clipboard')
      self.show()
      
   def copytext(self):

      #clipboard.setText(self.edit1.copy())
      self.edit1.copy()
      print (clipboard.text())

      msg=QMessageBox()
      msg.setText(clipboard.text()+" copied on clipboard")
      msg.exec_()

   def pastetext(self):
      self.edit2.setText(clipboard.text())

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

Приведенный выше код дает следующий вывод -

QPixmapкласс обеспечивает представление изображения за пределами экрана. Его можно использовать как объект QPaintDevice или загрузить в другой виджет, обычно в метку или кнопку.

Qt API имеет еще один похожий класс QImage, который оптимизирован для ввода-вывода и других манипуляций с пикселями. Pixmap, с другой стороны, оптимизирован для отображения на экране. Оба формата взаимно конвертируемы.

Типы файлов изображений, которые могут быть прочитаны в объекте QPixmap, следующие:

BMP Растровое изображение Windows
Гифка Графический формат обмена (необязательно)
JPG Объединенная группа экспертов в области фотографии
JPEG Объединенная группа экспертов в области фотографии
PNG Переносимая сетевая графика
PBM Переносимое растровое изображение
PGM Портативный Graymap
PPM Portable Pixmap
XBM Растровое изображение X11
XPM X11 Pixmap

Следующие методы полезны при обработке объекта QPixmap:

Sr. No. Методы и описание
1

copy()

Копирует данные растрового изображения из объекта QRect

2

fromImage()

Преобразует объект QImage в QPixmap

3

grabWidget()

Создает изображение из заданного виджета

4

grabWindow()

Создать растровое изображение данных в окне

5

Load()

Загружает файл изображения как растровое изображение

6

save()

Сохраняет объект QPixmap как файл

7

toImage

Преобразует QPixmap в QImage

Чаще всего QPixmap используется для отображения изображения на ярлыке / кнопке.

пример

В следующем примере показано изображение, отображаемое в QLabel с помощью setPixmap() метод.

Полный код выглядит следующим образом -

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

def window():
   app = QApplication(sys.argv)
   win = QWidget()
   l1 = QLabel()
   l1.setPixmap(QPixmap("python.png"))

   vbox = QVBoxLayout()
   vbox.addWidget(l1)
   win.setLayout(vbox)
   win.setWindowTitle("QPixmap Demo")
   win.show()
   sys.exit(app.exec_())

if __name__ == '__main__':
   window()

Приведенный выше код дает следующий вывод -