PyQt

Материал из Википедии — свободной энциклопедии
Перейти к: навигация, поиск
PyQt
Python and Qt.svg
Qt Designer (rus).png
Qt Designer в Linux с KDE
Тип

Привязка Qt для Python

Разработчик

Riverbank Computing

Написана на
Операционная система

Мультиплатформенное ПО (Windows, MacOS, Unix)

Первый выпуск

1998 год

Последняя версия

5.8.2 (30 марта 2017)

Лицензия

GPL2, GPL3 и коммерческая

Сайт

riverbankcomputing.com/software/pyqt/intro

Commons-logo.svg PyQt на Викискладе

PyQt — набор «привязок» графического фреймворка Qt для языка программирования Python, выполненный в виде расширения Python.

PyQt разработан британской компанией Riverbank Computing[1]. PyQt работает на всех платформах, поддерживаемых Qt: Linux и другие UNIX-подобные ОС, Mac OS X и Windows. Существует 2 версии: PyQt5, поддерживающий Qt 5, и PyQt4, поддерживающий Qt 4. PyQt распространяется под лицензиями GPL (2 и 3 версии) и коммерческой[2].

PyQt практически полностью реализует возможности Qt. А это более 600 классов[3], более 6000 функций и методов, включая:

PyQt также включает в себя Qt Designer (Qt Creator) — дизайнер графического интерфейса пользователя. Программа pyuic генерирует Python код из файлов, созданных в Qt Designer. Это делает PyQt очень полезным инструментом для быстрого прототипирования. Кроме того, можно добавлять новые графические элементы управления, написанные на Python, в Qt Designer.

Раньше PyQt поставлялся вместе со средой разработки Eric, написанной на PyQt. Eric имеет встроенный отладчик и может быть использована для создания консольных программ. Теперь она доступна в качестве отдельного проекта[4][5][6].

Обзор основных модулей[править | править вики-текст]

  • QtCore — основные не графические классы: система сигналов и слотов, платформонезависимые абстракции для Unicode, потоков, разделяемой памяти, регулярных выражений и т. д.
  • QtGui — компоненты графического интерфейса (элементы управления), основанные на визуальном представлении.
  • QtNetwork — классы для сетевого программирования. Например, клиентов и серверов через UDP и TCP.
  • QtOpenGL — классы, позволяющие использовать OpenGL и 3D-графику в приложениях PyQt.
  • QtScript — классы, позволяющие использовать встроенный в Qt интерпретатор JavaScript для управления приложением.
  • QtSql — классы для интеграции с базами данных с помощью SQL.
  • QtSvg — классы для отображения векторной графики в формате SVG.
  • QtXml — классы, реализующие обработку XML.
  • uic — реализация обработки XML-файлов, созданных в Qt Designer, для генерации из них Python-кода графического интерфейса[2].

Дизайнер графического интерфейса пользователя[править | править вики-текст]

Создание простого веб-браузера перетаскиванием виджетов

Qt Designer является кросс-платформенным компоновщиком макетов и форм графического интерфейса пользователя. Он позволяет быстро спроектировать виджеты и диалоги, используя экранные формы с использованием тех же виджетов, которые будут использоваться в приложении. Формы, созданные с Qt Designer, являются полностью функциональными, а также могут быть просмотрены в режиме реального времени[7].

Примеры программ[править | править вики-текст]

Программа Hello, world![править | править вики-текст]

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

#! /usr/bin/env python2
# -*- coding: utf-8 -*-
#
import sys
from PyQt4.QtGui import * # компоненты интерфейса

# Каждое приложение должно создать объект QApplication
# sys.argv - список аргументов командной строки
application = QApplication(sys.argv)

# QWidget - базовый класс для всех объектов интерфейса
# пользователя; если использовать для виджета конструктор
# без родителя, такой виджет станет окном
widget = QWidget()

widget.resize(320, 240) # изменить размеры виджета
widget.setWindowTitle("Hello, World!") # установить заголовок
widget.show() # отобразить окно на экране

sys.exit(application.exec_()) # запуск основного цикла приложения
Результат выполнения программы в Linux с KDE

Более сложный пример[править | править вики-текст]

В этом примере показаны принципы создания более серьёзных программ. Используется Python 3 и Qt Designer. Применяется объектно-ориентированный подход, позволяющий разделить визуальное представление и логику программы.

Состав программы:

  • test.pyw — главный файл, запускающий программу.
  • mainform.py — файл описания главного окна.
  • mainform.ui — файл, содержащий автоматически сгенерированное при помощи Qt Designer описание главного окна. В программе Qt Designer был создан проект, основанный на QDialog и выбраны 2 элемента: кнопка с именем pushButton, текстовая метка с именем label.

Содержание файла test.pyw:

#! /usr/bin/env python3
#
import sys
from PyQt4 import QtCore, QtGui # подключает основные модули PyQt
import mainform # подключает модуль описания формы

def main():
    app = QtGui.QApplication(sys.argv)  # создаёт основной объект программы
    form = mainform.MainForm()  # создаёт объект формы
    form.show()  # даёт команду на отображение объекта формы и содержимого
    return app.exec()  # запускает приложение

if __name__ == "__main__":
    sys.exit(main())

Содержание файла mainform.py:

#! /usr/bin/env python3
#
from PyQt4 import QtCore, QtGui, uic # подключает основные модули PyQt

# прототип главной формы
class MainForm(QtGui.QDialog):

    # конструктор
    def __init__(self):
        super(MainForm, self).__init__()

        # динамически загружает визуальное представление формы
        uic.loadUi("mainform.ui", self)

        # связывает событие нажатия на кнопку с методом
        self.connect(self.pushButton, QtCore.SIGNAL("clicked()"),
            self.setLabelText)

    def setLabelText(self):
        self.label.setText("New label text")
Результат выполнения программы в Windows XP

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

SIP[править | править вики-текст]

SIP — это инструмент для автоматической генерации Python-привязок к C и C++ библиотекам. Первоначально SIP был разработан в 1998 году для PyQt — Python-привязки для инструментария виджетов Qt, но подходит и для создания привязок к любым другим C или C++ библиотекам[8].

SIP берёт набор инструкций (.sip файлы), описывающих API и генерирует требуемый C++ код. Потом он компилируется и на выходе получается модуль Python. Файлы .sip — файлы заголовков класса, у которых кое-что убрано (потому что SIP не содержит полноценный C++-парсер) и кое-что добавлено (поскольку C++ не несёт достаточной информации о работе API).

Для PyQt4 используется внутренний инструмент (написанный на PyQt), называемый metasip. Это своего рода IDE для SIP. Он использует GCC-XML для разбора заголовочных файлов последней версии и сохраняет релевантные данные в XML, в metasip-проект. metasip далее делает некое подобие diff с предыдущей версией API и отмечает все изменения, которые необходимо просмотреть. Затем список изменений генерируется при помощи GUI и автоматически заносится в TODO. Создание .sip файлов — просто нажатие на кнопку.

Что касается работы сгенерированного кода, она не сильно отличается от работы любого другого генератора привязок. У Python очень хороший API модулей — это одна из причин большого количества Python-привязок для инструментов сторонних разработчиков. Для каждого C++-класса SIP генерирует C-код, создающий соответствующий Python-класс[9].

Особенности лицензирования[править | править вики-текст]

Двойная лицензия PyQt продиктована довольно сложными отношениями в сфере применения этой надстройки (привязки) над графической библиотекой Qt. В соответствии с лицензией GPL, возможно использование библиотеки для создания программ с открытым исходным кодом. Если нет возможности распространять код в соответствии с условиями GPL, то можно приобрести коммерческую лицензию[10].

Со стороны Nokia были попытки договориться с Riverbank Computing на предмет смены лицензии, но они не увенчались успехом. В результате возник проект под названием PySide[11] — аналог PyQt, в том числе сохраняющий совместимость с последним на уровне API, но выпущенный под лицензией LGPL, чтобы дать возможность разработчикам и коммерческих проектов бесплатно использовать Python в связке с Qt.

Однако Riverbank не исключает возможности лицензирования PyQt под LGPL в будущем.

История[править | править вики-текст]

Riverbank Computing Limited с 1998 года разрабатывает и поддерживает PyQt, привязки, которые позволяют использовать Qt для работы с языком программирования Python[1].

  • Разработка началась с создания SIP и выпуска PyQt 0.1 с поддержкой Qt 1.41 в ноябре 1998[12];
  • в версии 2.0, которая вышла в 2000, реализована поддержка Qt 2.2 на Linux и Windows[12];
  • поддержка Qt 3 реализована в 2001[12];
  • поддержка Mac OS X реализована в 2002[12];
  • выпуск PyQt4 начался с PyQt 4.0 с поддержкой Qt 4 в июне 2006[12];
  • в версии 4.5, которая вышла 5 июня 2009, реализована поддержка Python 3[13];
  • в версии 4.7, которая вышла 14 января 2010, реализована поддержка Qt 4.6[14];
  • в версии 5.0, которая вышла 17 июня 2013, реализована поддержка Qt 5.0[15].

Известные программы, использующие PyQt[править | править вики-текст]

Применение[править | править вики-текст]

PyQt — продукт, имеющий широкую пользовательскую базу. Среди коммерческих пользователей PyQt можно отметить такие известные корпорации, как Disney, Dreamworks, Pixar, Industrial Light and Magic и Sony Pictures. Всего коммерческих пользователей более 200 (по данным в 2006 году)[9].

См. также[править | править вики-текст]

Примечания[править | править вики-текст]

  1. 1 2 Riverbank Computing (англ.). Сайт Nokia. Проверено 10 мая 2010. Архивировано 4 марта 2012 года.
  2. 1 2 What is PyQt? (англ.). Сайт PyQt. Проверено 10 мая 2010. Архивировано 4 марта 2012 года.
  3. PyQt Whitepaper (англ.). Сайт PyQt. Проверено 10 мая 2010. Архивировано 4 марта 2012 года.
  4. The Eric Python IDE (англ.). Сайт Eric IDE. Проверено 10 мая 2010. Архивировано 4 марта 2012 года.
  5. About PyQt (англ.). Python Wiki. Проверено 10 мая 2010. Архивировано 4 марта 2012 года.
  6. PyQt4 (англ.). Python Wiki. Проверено 10 мая 2010. Архивировано 4 марта 2012 года.
  7. GUI Designer (англ.). Nokia. Проверено 10 мая 2010. Архивировано 4 марта 2012 года.
  8. Introduction — SIP (англ.). Сайт PyQt. Проверено 14 августа 2010. Архивировано 4 марта 2012 года.
  9. 1 2 Phil Thompson Talks About PyQt (англ.). KDE.news. Проверено 13 августа 2010. Архивировано 4 марта 2012 года.
  10. License (англ.). Сайт PyQt. Проверено 10 мая 2010. Архивировано 4 марта 2012 года.
  11. PySide FAQ (англ.). Сайт PySide. Проверено 10 мая 2010. Архивировано 4 марта 2012 года.
  12. 1 2 3 4 5 Mark Summerfield. Rapid GUI Programming with Python and Qt. — 1st. — Prentice Hall, 2008. — 648 p. — ISBN 978-0132354189.
  13. PyQt v4.5 Released (англ.). Сайт PyQt. Проверено 10 мая 2010. Архивировано 4 марта 2012 года.
  14. PyQt v4.7 Released (англ.). Сайт PyQt. Проверено 10 мая 2010. Архивировано 4 марта 2012 года.
  15. PyQt v5.0 Released (англ.). Сайт PyQt. Проверено 2 июля 2013. Архивировано 2 июля 2013 года.

Литература[править | править вики-текст]

Ссылки[править | править вики-текст]