Pull to refresh

Рисуем свою кнопку в QGraphicsScene в PyQt4

PythonQt
Sandbox
Казалось бы, что может быть проще обычной кнопки с её стандартным поведением и привычным всему миру видом? Однако, сам процесс создания своей кнопки не менее интересен, чем создание целого приложения с помощью PyQt4.

Здесь приводится пример создания в QGraphicsScene своей рисованной кнопки с помощью QGraphicsWidget.

Рекомендуется к прочтению людям, имеющим опыт работы с PyQt4.

Для начала, разберёмся, что из себя представляет кнопка.
Обычная кнопка — это, чаще всего, прямоугольник с текстом и/или картинкой, щелчок мышью на который сопровождается визуальным откликом. Основное назначение кнопок — реагировать на простое событие нажатия и отжатия указателем мыши (или пальцем), находящегося в поле координат этой кнопки.

  1. # -*- coding: utf-8 -*-
  2. from PyQt4 import QtCore, QtGui
  3. import sys
  4. class AButton(QtGui.QGraphicsWidget):
  5. # нажата ли кнопка мыши
  6. mouse_isPressed = False
  7. def __init__(self, parent = None):
  8. QtGui.QGraphicsWidget.__init__(self)
  9. def boundingRect(self):
  10. # размеры кнопки
  11. # для наглядности возвращается фиксированное значение
  12. # хотя можно считать размеры текста и иконки и
  13. # использовать их динамически.
  14. # QRectF, в отличие от QRect, позволяет оперировать
  15. # числами с плавающей точкой.
  16. return QtCore.QRectF(0, 0, 40, 40)
  17. def paint(self, painter, option, widget = 0):
  18. # метод прорисовки кнопки со стилями
  19. opt = QtGui.QStyleOptionButton()
  20. # стиль нажатой и отжатой кнопки в зависимости от того,
  21. # нажата ли кнопка мыши
  22. opt.state = ((QtGui.QStyle.State_Sunken if self.mouse_isPressed else QtGui.QStyle.State_Raised) | QtGui.QStyle.State_Enabled)
  23. # текст на кнопке
  24. opt.text = self.text()
  25. # иконка кнопки
  26. opt.icon = self.icon()
  27. # геометрия
  28. opt.rect = option.rect
  29. # палитра для стиля
  30. opt.palette = option.palette
  31. # сама прорисовка кнопки с определённым выше стилем и опциями
  32. QtGui.QApplication.style().drawControl(QtGui.QStyle.CE_PushButton, opt, painter)
  33. def text(self):
  34. # метод, возвращающий текст, отображаемый на кнопке
  35. # для наглядности возвращаем фиксированное значение
  36. return QtCore.QString("hi")
  37. def icon(self):
  38. # метод, возвращающий иконку кнопки
  39. # пока возвращаем пустую иконку
  40. # вроде можно использовать QPixmap вместо QIcon
  41. return QtGui.QIcon()
  42. def mousePressEvent(self, event):
  43. # событие нажания кнопки мыши и обновление
  44. # внешнего вида состояния кнопки
  45. self.mouse_isPressed = True
  46. self.update()
  47. def mouseReleaseEvent(self, event):
  48. # отжатие кнопки
  49. self.mouse_isPressed = False
  50. # метод update - обязательный, он отвечает за перерисовку
  51. # любого графического виджета
  52. self.update()
  53. if __name__ == "__main__":
  54. app = QtGui.QApplication(sys.argv)
  55. # создаём графическую область, на которой будет рисоваться
  56. # наша кнопка
  57. scene = QtGui.QGraphicsScene()
  58. # создаём кнопку
  59. button = AButton()
  60. # добавляем кнопку в графическую область
  61. scene.addItem(button)
  62. # и создаём графическое поле, на которое накладывается
  63. # графическая область с кнопкой
  64. view = QtGui.QGraphicsView(scene)
  65. # сглаживание
  66. view.setRenderHint(QtGui.QPainter.Antialiasing)
  67. # задаём размер графического поля
  68. view.resize(200, 100)
  69. # фон
  70. view.setBackgroundBrush(QtGui.QApplication.palette().background())
  71. view.show()
  72. sys.exit(app.exec_())



В моём случае, этот код исправно работает в PyQt 4.9.1 for Python 2.7.

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

Изначально, вышеописанный код был найден в интернете, написанный на C++, благополучно сохранён на компьютер, а источник утерян. Позже и сам код был переписан на язык Python с некоторыми особенностями, а оригинал удалён с компьютера.

Благодарю за внимание.
Tags:pyqtpyqt4buttonpythonкнопкаграфический виджетQGraphicsSceneQGraphicsWidget
Hubs: Python Qt
Total votes 20: ↑15 and ↓5 +10
Views10.3K

Popular right now

Разработчик Python
from 80,000 to 150,000 ₽СтратоСфераЗеленоградRemote job
Разработчик Python
from 160,000 to 200,000 ₽C-Executives LLCМоскваRemote job
Программист Python
from 40,000 to 60,000 ₽ПК «Энергосбережение»Remote job
С++ разработчик (Qt)
from 80,000 ₽Бизнес.РуУфа
Python Developer/ Разработчик Python
from 200,000 ₽ТрансКонтейнерМосква