PyQt4 — Введение

http://zetcode.com/tutorials/pyqt4/
  • Перевод
Python
PyQt4 это тулкит для разработки GUI приложений. Он представляет из себя смесь языка программирование Пайтон (Питон) и библиотеки Qt. Qt – одна из наиболее мощных библиотек на этой планете. Если не самая мощная. Официальный сайт PyQt www.riverbankcomputing.co.uk разработан Филом Томпсоном.
PyQt4 представляет из себя набор модулей Пайтон. Она содержит более 300 классов и почти 6000 функций и методов. Это мультиплатформенный тулкит. Он работает на всех основных операционных системах, включая Unix, Windows и MacOS.
Начиная с версии PyQt4 GPL доступна для всех поддерживаемых платформ.

Так как тулкит содержит большое количество классов, они распределены в несколько модулей.
Модули PyQt4
Модуль QtCore содержит ядро не-gui функциональности. Этот модуль используется для работы со временем, файлами и папками, различными типами даных, потоками, адресами URL, mime типами, потоками процессов. Модуль QtGui содержит графические компоненты и связанные классы. Сюда включены, например, кнопки, окна, строки состояния, панели инструментов, полосы прокрутки, изображения (bitmap), цвета, шрифты и др. Модуль QtNetwork содержит классы для сетевого программирования. Эти классы позволяют писать TCP/IP и UDP клиенты и серверы. Они делают сетевое программирование легче и более доступным. Модуль QtXml содержит классы для работы с xml файлами. Он предоставляет реализации API SAX и DOM. Модуль QtSvg предоставляет классы для отображения содержимого SVG файлов. Масштабируемая векторная графика (SVG) – это язык описания двумерной графики и графических приложений на языке XML. Модуль QtOpenGL используется для построения 3D и 2D графики с помощью библиотеки OpenGL. Модуль дает возможность бесшовной интеграции библиотек QtGui и OpenGL. Модуль QtSql содержит классы для работы с базами данных.

Простой пример
Код данного примера очень краток. Он лишь отображает небольшое окошко. Однако мы сможем сделать с ним многое. Мы сможем изменить его размеры. Распахнуть на весь экран. Минимизировать. Это требует достаточно большого кода. Кто-то уже написал эту функциональность. Потому что она повторяется в большинстве приложений, нет необходимости писать этот код опять. Таким образом это скрыто от программиста. PyQt высокоуровневый тулкит. Если бы мы писали для низкоуровневого тулкита, то следующий пример был бы намного больше.
#!/usr/bin/python
# simple.py

import sys
from PyQt4 import QtGui

app = QtGui.QApplication(sys.argv)

widget = QtGui.QWidget()
widget.resize(250, 150)
widget.setWindowTitle('simple')
widget.show()

sys.exit(app.exec_())

import sys
from PyQt4 import QtGui

Подключаем необходимые модули. Основные GUI виджеты находятся в библиотеке QtGui.
app = QtGui.QApplication(sys.argv)

Каждое приложение PyQt4 должно создать объект Qapplication. Этот объект находится в модуле QtGui. Параметр sys.argv это список аргументов командной строки. Скрипты на Пайтон могут быть запущены из консоли, и с помощью аргументов мы можем контролировать запуск приложения.
widget = QtGui.QWidget()

Qwidget это базовый класс для всех объектов интерфейса пользователя для PyQt4. Мы используем стандартный конструктор для Qwidget, который не имеет родителя. Виджет у которого нет родительского является окном.
widget.resize(250, 150)

Метод resize() изменяет размеры виджета. В данном случае 250 пикселей по ширине и 150 по высоте.
widget.setWindowTitle('simple')

Здесь мы устанавлиаем заголовок окна на simple.
widget.show()

Метод show() отображает окно на экране.
sys.exit(app.exec())

В конце мы запускаем основной цикл приложения. Отсюда начинается обработка событий. Приложение получает события от оконной системы и распределяет их по виджетам. Когда цикл заканчивается, и если мы вызовем метод exit(), то наше окно (главный виджет) будет уничтожено. Метод sys.exit() гарантирует чистый выход. Окружение будет проинформировано о том, как приложение завершилось.
Вы удивлены почему метод exec_() записан с подчеркиваение? Это сделано потому, что exec – ключевое слово в пайтон.
Простое окно

Иконка приложения
Иконка программы это просто маленькое изображение, которое обычно отображаетяс в левом верхнем углу заголовка. В следующем примере мы покажем как сделать это на PyQt4. Мы также представим некоторые новые методы.
#!/usr/bin/python
# icon.py

import sys
from PyQt4 import QtGui

class Icon(QtGui.QWidget):
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)

        self.setGeometry(300, 300, 250, 150)
        self.setWindowTitle('Icon')
        self.setWindowIcon(QtGui.QIcon('icons/web.png'))

app = QtGui.QApplication(sys.argv)
icon = Icon()
icon.show()
sys.exit(app.exec_())

В предыдущем примере код был процедурным. Пайтон поддерживает как процедурный, так и объекто-ориентированные стили программирования. Программирование на PyQt4 предполагает ООП программирование.
class Icon(QtGui.QWidget):
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)

Три наиболее важные вещи в объекто-ориентированном программировании это классы, данные и методы. Здесь мы создаем новый класс Icon. Класс Icon наследован от класса QtGui.QWidget. Это значит, что мы должны вызвать два конструктора: во-первых, для класса Icon и, во-вторых, для наследованного класса.
self.setGeometry(300, 300, 250, 150)
self.setWindowTitle('Icon')
self.setWindowIcon(QtGui.QIcon('icons/web.png'))

Все три класса наследованы от класса QtGui.QWidget. Метод setGeometry() делает две вещи: он определяет положение окна и его размеры. Первые два параметра это координаты по оси X и Y соответственно. Третий задает ширину окна, а четвёртый высоту. Последний метод setWindowIcon() устанавливает иконку программы. Чтобы сделать это, мы создаём объект QIcon. В качестве параметра передаётся путь до файла иконки.
Иконка

Всплывающая подсказка
Мы можем создать всплывающую подсказку для любого виджета.
#!/usr/bin/python
# tooltip.py

import sys
from PyQt4 import QtGui
from PyQt4 import QtCore

class Tooltip(QtGui.QWidget):
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)

        self.setGeometry(300, 300, 250, 150)
        self.setWindowTitle('Tooltip')

        self.setToolTip('This is a QWidget widget')
        QtGui.QToolTip.setFont(QtGui.QFont('OldEnglish', 10))

app = QtGui.QApplication(sys.argv)
tooltip = Tooltip()
tooltip.show()
app.exec_()

В этом примере, мы показываем подсказку для виджета Qwidget.
self.setToolTip('This is a QWidget widget')

Для создания подсказки вызываем метод setToolTip(). Можно использовать html тэги для форматирования.
QtGui.QToolTip.setFont(QtGui.QFont('OldEnglish', 10))

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

Закрытие окна
Самый очевидный путь закрытия окна, это щелкнуть на кнопке закрытия в заголовке окна. В следующем примере мы покажем как можно программно закрыть окно. Для этого мы кратко коснёмся сигналов и слотов.
QPushButton(string text, QWidget parent = None)

Это конструктор QPushButton, который мы будем использовать в нашем примере. Параметр text – это текст, который будет отображаться на кнопке, parent – тот виджет, на который мы поместим кнопку. В нашем случае это Qwidget.
#!/usr/bin/python
# quitbutton.py

import sys
from PyQt4 import QtGui, QtCore

class QuitButton(QtGui.QWidget):
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)

        self.setGeometry(300, 300, 250, 150)
        self.setWindowTitle('Icon')

        quit = QtGui.QPushButton('Close', self)
        quit.setGeometry(10, 10, 60, 35)
        self.connect(quit, QtCore.SIGNAL('clicked()'),
            QtGui.qApp, QtCore.SLOT('quit()'))

app = QtGui.QApplication(sys.argv)
qb = QuitButton()
qb.show()
sys.exit(app.exec_())

quit = QtGui.QPushButton('Close', self)
quit.setGeometry(10, 10, 60, 35)

Мы создаём кнопку и распологаем её на виджете также, как мы размещали виджет на экране.
self.connect(quit, QtCore.SIGNAL('clicked()'),
QtGui.qApp, QtCore.SLOT('quit()'))

Система обработки событий в PyQt4 построена на механизме сигналов и слотов. Если мы щёлкнем на кнопке, то будет послан сигнал clicked(). Слот может быть как слотом PyQt4 так и любым возможным для языка Пайтон. Метод QtCore.QObject.connect() соединяет сигнал и слот. В нашем случае слот является предопределённым слотов PyQt4.
Кнопка закрытия

Окно сообщений
Обычно, при щелчке на кнопке закрытия в заголовке окна виджет закрывается. Иногда нам нужно изменить это действие. Например, если у нас открыт файл в редакторе с которым мы сделали какие-то изменения. В этом случае мы показываем пользователю сообщение для подтверждения выбранного действия.
#!/usr/bin/python
# messagebox.py

import sys
from PyQt4 import QtGui

class MessageBox(QtGui.QWidget):
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)

        self.setGeometry(300, 300, 250, 150)
        self.setWindowTitle('message box')

    def closeEvent(self, event):
        reply = QtGui.QMessageBox.question(self, 'Message',
            "Are you sure to quit?", QtGui.QMessageBox.Yes, QtGui.QMessageBox.No)

        if reply == QtGui.QMessageBox.Yes:
            event.accept()
        else:
            event.ignore()

app = QtGui.QApplication(sys.argv)
qb = MessageBox()
qb.show()
sys.exit(app.exec_())

Когда мы закрываем виджет, генерируется событие QCloseEvent. Для изменения поведения виджета нам нужно изменить обработчик события QCloseEvent.
reply = QtGui.QMessageBox.question(self, 'Message',
    "Are you sure to quit?", QtGui.QMessageBox.Yes, QtGui.QMessageBox.No)

Мы выводим сообщение с двумя кнопками “Да” и “Нет”. Первая строка ('Message') выводится в заголовке окна, вторая – текст сообщения. Возвращаемое значение хранится в переменной reply.
if reply == QtGui.QMessageBox.Yes:
    event.accept()
else:
    event.ignore()

Здесь мы проверяем возвращаемое значение: если щелкнули по кнопке “yes”, то мы принимаем стандартный обработчик, иначе – игнорируем закрытие.
Сообщение

P. S.: Продолжение следует…
Метки:
Поделиться публикацией
Похожие публикации
Комментарии 29
  • 0
    Спасибо за перевод. Перенесите в Python
    • 0
      Спасибо, перенёс.
  • +1
    думаю стоило еще упомянуть о QT Designer. нету ничего удобнее, если надо быстро нарисовать интерфейс.
    • 0
      Угу, согласен про удобство, однако всё же это перевод =)
    • 0
  • 0
    Молодец, перевел!

    Вот прочитал, и уже задумываюсь, может стоит попробывать?
  • 0
    Отлично, весьма познавательно.
  • 0
    Убейте меня кто-нибудь, я не разобрался с установкой PyQT под винду :(
    • 0
      Да вроде всё элементарно: скачиваешь .exe установщик и следуешь инструкциям. =)
      • 0
        Облазил весь виндозский инсталл, там только сорсы, ни одного экзешника, даже самого завалящего :( Оно еще SIP требует, с ним та же история. Надо переходить на линукс...
          • 0
            Да, спасибо, я уже сам нашел. Дык че, теперь я все GUI программы буду на питоне писать :)
        • 0
          SIP можно доставить. У меня почти получилось заставить все это работать около года назад на WinXP, но к сожалению все примеры вылетали при запуске.
    • 0
      http://www.riverbankcomputing.co.uk/soft…
      Там есть пакет со всеми зависимостями под винду.
  • 0
    А в каком виде сама программа получается. Что с ней распространять надо? Запустится ли она на машине где нет Питона и Qt?
    • 0
      Получается в виде скрипта. В принципе она может запуститься и без установленного Python и Qt (например, KomodoEdit таскает всё с собой), только я пока не знаю как это сделать. =)
      • +1
        py2exe, для PyQt4 зависимости такие
      • 0
        в догонку: AFAIR, Komodo не на PyQt, а на Mozilla XUL.
        • 0
          Я не имел ввиду, что Komodo на Qt. Просто он одним архивом: распаковал - работай.
    • +1
      Любую программу на питоне можно преобразовать в запускаемый однофайловый бинарник. Для этого можно использовать пакеты py2exe (http://www.py2exe.org/) на windows или bbfreeze (http://pypi.python.org/pypi/bbfreeze/) для windows и linux.
      • 0
        Хм, а если она использует PyQT?
        • 0
          Все используемые либы упаковываются в один файл. В том числе отслеживаются и бинарные зависимости в случае с bbfreeze.
  • 0
    Так же рекомендую wxpython всем кому необходимо разрабатывать GUI приложения на питоне.

    http://wxpython.org/screenshots.php
    • 0
      Почему (кроме лицензии)?
      • 0
        qt - некий давнишний стандарт на gui в линукс, организация библиотеки в нем и многие другие вещи опираются на старые корни и при первом углубленном знакомстве могут показаться запутанными. wx в этом вопросе немного прозрачнее и проще для восприятия, даже в случае довольно сильно накрученного оконного приклада.

        Справедливости ради скажу, что подобное мнение я составил несколько лет назад и сейчас дела уже вполне могли измениться. Поэтому на вопрос "почему" отвечу "в ознакомительных целях".
        • 0
          На мой взгляд единственный плюс wxWidgets/wxPython - это лицензия, ну + меньший размер библиотек, что уменьшает размер дистрибутива, если включать в него все зависимости. А в плане архитектуры и понятности Qt выигрывает + документация в Qt получше будет. Для wxPython нет такого же удобного дизайнера как в Qt, все что пробовал(Boa Construcor, wxGlade) - не понравилось. Но для ознакомления думаю стоит посмотреть.
  • 0
    Здорово, давно хотел изучить PyQt, но как-то лень было и дальше пары примеров не заходил. Спасибо, обязательно продолжайте!
  • 0
    При использовании Python совместно с Qt встает вопрос — пользоваться ли стандартными библиотеками или библиотеками Qt? Эта «проблема» рассмотрена тут: PyQt: unpythonic GUI (а так же 2 способа работы с дизайнером)
  • 0
    По PyQt есть не плохие книги Прохорецока Н. А. (Например, Python 3 и PyQt. Разработка приложений), но у вас достаточно понятно расписано каждый шаг и что откуда берется. Мне как раз для пояснения студентам завтра на лекции ваша статья очень поможет :)

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