ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 05.12.2023
Просмотров: 878
Скачиваний: 3
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
СОДЕРЖАНИЕ
В первых трех форматах указываются координаты и размеры прямоугольника, в кото- рый необходимо вписать эллипс. В двух последних форматах первый параметр задает координаты центра, параметр rX
— радиус по оси
X
, а параметр rY
— радиус по оси
Y
;
drawArc()
— рисует дугу. Форматы метода: drawArc(
Следует учитывать, что значения углов задаются в значениях
1
/
16
°. Полный круг экви- валентен значению 5760 = 16
× 360. Нулевой угол находится в позиции «трех часов».
Положительные значения углов отсчитываются против часовой стрелки, а отрицатель- ные — по часовой стрелке;
drawChord()
— рисует замкнутую дугу. Аналогичен методу drawArc()
, но соединяет крайние точки дуги прямой линией. Форматы метода: drawChord(
drawPie()
— рисует замкнутый сектор. Аналогичен методу drawArc()
, но соединяет крайние точки дуги с центром окружности. Форматы метода: drawPie(
При выводе некоторых фигур (например, эллипса) контур может отображаться в виде «ле- сенки». Чтобы сгладить контуры фигур, следует вызвать метод setRenderHint()
и передать ему в качестве единственного параметра атрибут
Antialiasing класса
QPainter
: painter.setRenderHint(QtGui.QPainter.Antialiasing)
Если требуется отключить сглаживание, следует вызвать тот же метод, но передать ему вторым параметром значение
False
: painter.setRenderHint(QtGui.QPainter.Antialiasing, False)
570
Часть II. Библиотека PyQt 5 24.2.2. Вывод текста
Вывести текст позволяет метод drawText()
класса
QPainter
. Форматы метода: drawText(
Первые три формата метода выводят текст, начиная с указанных координат.
Следующие три формата выводят текст в указанную прямоугольную область. При этом текст, который не помещается в эту область, будет обрезан, если не указан флаг
TextDontClip
. Методы возвращают экземпляр класса
QRect
(
QRectF
для шестого формата) с координатами и размерами прямоугольника, в который вписан текст. В параметре
<Флаги>
через оператор
|
указываются атрибуты
AlignLeft
,
AlignRight
,
AlignHCenter
,
AlignTop
,
AlignBottom
,
AlignVCenter или
AlignCenter класса
QtCore.Qt
, задающие выравнивание тек- ста внутри прямоугольной области, а также следующие атрибуты:
TextSingleLine
— все пробельные символы (табуляция, возвраты каретки и переводы строки) трактуются как пробелы, и текст выводится в одну строку;
TextDontClip
— часть текста, вышедшая за пределы указанной прямоугольной области, не будет обрезаться;
TextExpandTabs
— символы табуляции будут обрабатываться;
TextShowMnemonic
— символ, перед которым указан знак
&
, будет подчеркнут. Чтобы вывести символ
&
, его необходимо удвоить;
TextWordWrap
— если текст не помещается на одной строке, будет произведен перенос слова без его разрыва;
TextWrapAnywhere
— перенос строки может быть выполнен внутри слова;
TextHideMnemonic
— то же самое, что и
TextShowMnemonic
, но символ не подчеркивается;
TextDontPrint
— текст не будет напечатан;
TextIncludeTrailingSpaces
— размеры текста будут возвращаться с учетом начальных и конечных пробелов, если таковые есть в тексте;
TextJustificationForced
— задает выравнивание по ширине для последней строки текста.
Седьмой формат метода drawText()
также выводит текст в указанную прямоугольную об- ласть, но выравнивание текста и другие опции задаются с помощью экземпляра класса
QTextOption
. Например, с помощью этого класса можно отобразить непечатаемые символы
(символ пробела, табуляцию и др.).
Получить координаты и размеры прямоугольника, в который вписывается текст, позволяет метод boundingRect()
. Форматы метода: boundingRect(
Глава 24. Работа с графикой
571
Первые два формата метода boundingRect()
возвращают экземпляр класса
QRect
, а послед- ние два — экземпляр класса
QRectF
При выводе текста линии букв могут отображаться в виде «лесенки». Чтобы сгладить кон- туры, следует вызвать метод setRenderHint()
и передать ему атрибут
TextAntialiasing класса
QPainter
: painter.setRenderHint(QtGui.QPainter.TextAntialiasing)
Если требуется отключить сглаживание, следует вызвать тот же метод, но передать ему вторым параметром значение
False
: painter.setRenderHint(QtGui.QPainter.TextAntialiasing, False)
24.2.3. Вывод изображения
Для вывода растровых изображений предназначены методы drawPixmap()
и drawImage()
класса
QPainter
. Метод drawPixmap()
предназначен для вывода изображений, хранимых в экземпляре класса
QPixmap
. Форматы метода: drawPixmap(
Первые три формата задают координаты, в которые будет установлен левый верхний угол выводимого изображения, и экземпляр класса
QPixmap
: pixmap = QtGui.QPixmap("foto.jpg") painter.drawPixmap(3, 3, pixmap)
Четвертый и пятый форматы позволяют ограничить вывод изображения указанной прямо- угольной областью. Если размеры области не совпадают с размерами изображения, то про- изводится масштабирование изображения. При несоответствии пропорций изображение может быть искажено.
Шестой, седьмой и восьмой форматы задают координаты, в которые будет установлен ле- вый верхний угол фрагмента изображения. Координаты и размеры вставляемого фрагмента изображения указываются после экземпляра класса
QPixmap в виде отдельных составляю- щих или экземпляров классов
QRect или
QRectF
Последние три формата ограничивают вывод фрагмента изображения указанной прямо- угольной областью. Координаты и размеры вставляемого фрагмента изображения указыва- ются после экземпляра класса
QPixmap в виде отдельных составляющих или экземпляров классов
QRect или
QRectF
. Если размеры области не совпадают с размерами фрагмента изо- бражения, производится масштабирование изображения. При несоответствии пропорций изображение может быть искажено.
572
Часть II. Библиотека PyQt 5
Метод drawImage()
предназначен для вывода изображений, хранимых в экземплярах класса
QImage
. Форматы метода: drawImage(
Первые два формата, а также пятый формат со значениями по умолчанию задают координа- ты, по которым будет находиться левый верхний угол выводимого изображения, и экземп- ляр класса
QImage
: img = QtGui.QImage("foto.jpg") painter.drawImage(3, 3, img)
Третий и четвертый форматы позволяют ограничить вывод изображения указанной прямо- угольной областью. Если размеры области не совпадают с размерами изображения, то про- изводится масштабирование изображения. При несоответствии пропорций изображение может быть искажено.
Пятый, шестой и седьмой форматы задают координаты, в которые будет установлен левый верхний угол фрагмента изображения. Координаты и размеры вставляемого фрагмента изо- бражения указываются после экземпляра класса
QImage в виде отдельных составляющих или экземпляров классов
QRect или
QRectF
Последние два формата ограничивают вывод фрагмента изображения указанной прямо- угольной областью. Координаты и размеры вставляемого фрагмента изображения указыва- ются после экземпляра класса
QImage в виде экземпляров классов
QRect или
QRectF
. Если размеры области не совпадают с размерами фрагмента изображения, производится масшта- бирование изображения. При несоответствии пропорций изображение может быть иска- жено.
Необязательный параметр flags задает цветовые преобразования, которые будут выполне- ны при выводе изображения (фактически — при неявном преобразовании экземпляра клас- са
QImage в экземпляр класса
QPixmap
, которое обязательно выполняется перед выво- дом). Они указываются в виде атрибутов класса
QtCore.Qt
, приведенных на странице https://doc.qt.io/qt-5/qt.html#ImageConversionFlag-enum. В большинстве случаев имеет смысл использовать заданное по умолчанию значение
AutoColor этого параметра.
24.2.4. Преобразование систем координат
Существуют две системы координат: физическая (viewport, система координат устройства) и логическая (window). При рисовании координаты из логической системы координат пре- образуются в систему координат устройства. По умолчанию эти две системы координат совпадают.
В некоторых случаях возникает необходимость изменить координаты. Выполнить измене- ние физической системы координат позволяет метод setViewport(
Глава 24. Работа с графикой
573
<Высота>)
или setViewport(
, а получить текущие значения — метод viewport()
Выполнить изменение логической системы координат позволяет метод setWindow(
или setWindow(
, а получить текущие значения — метод window()
класса
QPainter
Произвести дополнительную трансформацию системы координат позволяют следующие методы того же класса
QPainter
:
translate()
— перемещает начало координат в указанную точку. По умолчанию начало координат находится в левом верхнем углу. Положительная ось
X
направлена вправо, а положительная ось
Y
— вниз. Форматы метода: translate(
rotate(<Угол>)
— поворачивает систему координат на указанное количество градусов
(указывается вещественное число). Положительное значение вызывает поворот по часо- вой стрелке, а отрицательное значение — против часовой стрелки;
scale(<По оси X>, <По оси Y>)
— масштабирует систему координат. В качестве значе- ний указываются вещественные числа. Если значение меньше единицы, то выполняется уменьшение, а если больше единицы — то увеличение;
shear(<По горизонтали>, <По вертикали>)
— сдвигает систему координат. В качестве значений указываются вещественные числа.
Все указанные трансформации влияют на последующие операции рисования и не изменяют ранее нарисованные фигуры. Чтобы после трансформации восстановить систему координат, следует предварительно сохранить состояние в стеке с помощью метода save()
, а после окончания рисования вызвать метод restore()
: painter.save() # Сохраняем состояние
# Трансформируем и рисуем painter.restore() # Восстанавливаем состояние
Несколько трансформаций можно произвести последовательно друг за другом. При этом надо учитывать, что порядок следования трансформаций имеет значение.
Если одна и та же последовательность трансформаций выполняется несколько раз, то ее можно сохранить в экземпляре класса
QTransform
, а затем установить с помощью метода setTransform()
: transform = QtGui.QTransform() transform.translate(105, 105) transform.rotate(45.0) painter.setTransform(transform) painter.fillRect(-25, -25, 50, 50, QtCore.Qt.green)
24.2.5. Сохранение команд рисования в файл
Класс
QPicture выполняет роль устройства для рисования с возможностью сохранения ко- манд рисования в файл специального формата и последующего вывода его на экран. Иерар- хия наследования:
QPaintDevice — QPicture
574
Часть II. Библиотека PyQt 5
Форматы конструктора класса:
<Объект> = QPicture([formatVersion=-1])
<Объект> = QPicture(
Первый конструктор создает пустой рисунок. Необязательный параметр formatVersion задает версию формата. Если параметр не указан, то используется формат, принятый в те- кущей версии PyQt. Второй конструктор создает копию рисунка.
Для сохранения и загрузки рисунка предназначены следующие методы:
save(<Путь к файлу>)
— сохраняет рисунок в файл. Возвращает значение
True
, если рисунок успешно сохранен, и
False
— в противном случае;
load(<Путь к файлу>)
— загружает рисунок из файла. Возвращает значение
True
, если рисунок успешно загружен, и
False
— в противном случае.
Для вывода загруженного рисунка на устройство рисования предназначен метод drawPicture()
класса
QPainter
. Форматы метода: drawPicture(
Пример сохранения рисунка: painter = QtGui.QPainter() pic = QtGui.QPicture() painter.begin(pic)
# Здесь что-то рисуем painter.end() pic.save("pic.dat")
Пример вывода загруженного рисунка на поверхность компонента: def paintEvent(self, e): painter = QtGui.QPainter(self) pic = QtGui.QPicture() pic.load("pic.dat") painter.drawPicture(0, 0, pic)
24.3. Работа с изображениями
Библиотека PyQt включает несколько классов, позволяющих работать с растровыми изо- бражениями в контекстно-зависимом (классы
QPixmap и
QBitmap
) и контекстно-независимом
(класс
QImage
) представлениях.
Получить список форматов, которые можно загрузить, позволяет статический метод supportedImageFormats()
класса
QImageReader
, возвращающий список с экземплярами клас- са
QByteArray
. Получим список поддерживаемых форматов для чтения: for i in QtGui.QImageReader.supportedImageFormats(): print(str(i, "ascii").upper(), end=" ")
Результат выполнения:
BMP CUR GIF ICNS ICO JPEG JPG PBM PGM PNG PPM SVG SVGZ TGA TIF TIFF WBMP WEBP XBM
XPM
Глава 24. Работа с графикой
575
Получить список форматов, в которых можно сохранить изображение, позволяет статиче- ский метод supportedImageFormats()
класса
QImageWriter
, возвращающий список с экземп- лярами класса
QByteArray
. Получим список поддерживаемых форматов для записи: for i in QtGui.QImageWriter.supportedImageFormats(): print(str(i, "ascii").upper(), end=" ")
Результат выполнения:
BMP CUR ICNS ICO JPEG JPG PBM PGM PNG PPM TIF TIFF WBMP WEBP XBM XPM
Обратите внимание, что мы можем загрузить изображение в формате
GIF
, но не имеем воз- можности сохранить изображение в этом формате, поскольку алгоритм сжатия, используе- мый в нем, защищен патентом.
24.3.1. Класс QPixmap
Класс
QPixmap предназначен для работы с изображениями в контекстно-зависимом пред- ставлении. Данные хранятся в виде, позволяющем отображать изображение на экране наи- более эффективным способом, поэтому класс
QPixmap часто используется в качестве буфера для предварительного рисования графики перед выводом ее на экран. Иерархия наследо- вания:
QPaintDevice — QPixmap
Поскольку класс
QPixmap наследует класс
QPaintDevice
, мы можем использовать его как поверхность для рисования. Вывести изображение позволяет метод drawPixmap()
класса
QPainter
(см. разд. 24.2.3).
Форматы конструктора класса:
<Объект> = QPixmap()
<Объект> = QPixmap(<Ширина>, <Высота>)
<Объект> = QPixmap(
<Объект> = QPixmap(<Путь к файлу>[, format=None][, flags=AutoColor])
<Объект> = QPixmap(
Первый конструктор создает пустой объект изображения. Второй и третий конструкторы позволяют указать размеры изображения: если размеры равны нулю, то будет создан пустой объект. Четвертый конструктор предназначен для загрузки изображения из файла. Во вто- ром параметре указывается тип изображения в виде строки (например,
"PNG"
) — если он не указан, то формат будет определен по расширению загружаемого файла. Пятый конструк- тор создает копию изображения.
Класс
QPixmap поддерживает следующие методы (здесь приведены только основные — пол- ный их список можно найти на странице https://doc.qt.io/qt-5/qpixmap.html):
isNull()
— возвращает значение
True
, если объект является пустым, и
False
— в про- тивном случае;
load(<Путь к файлу>[, format=None][, flags=AutoColor])
— загружает изображение из файла. В первом параметре указывается абсолютный или относительный путь к файлу.
Во втором параметре можно задать формат файла в виде строки — если он не указан, формат определяется по расширению файла. Необязательный параметр flags задает тип преобразования цветов. Метод возвращает значение
True
, если изображение успешно за- гружено, и
False
— в противном случае;
576
Часть II. Библиотека PyQt 5
loadFromData(
— загружает изобра- жение из экземпляра класса
QByteArray
. В первом параметре можно указать данные, имеющие тип bytes
. Метод возвращает значение
True
, если изображение успешно за- гружено, и
1 ... 50 51 52 53 54 55 56 57 ... 83
False
— в противном случае;
save(<Путь к файлу>[, format=None][, quality=-1])
— сохраняет изображение в файл.
В первом параметре указывается абсолютный или относительный путь к файлу. Во вто- ром параметре можно задать формат файла в виде строки — если он не указан, формат будет определен по расширению файла. Необязательный параметр quality позволяет за- дать качество изображения. Можно передать значение в диапазоне от
0
до
100
, значение
-1
указывает качество по умолчанию. Метод возвращает значение
True
, если изображе- ние успешно сохранено, и
False
— в противном случае;
convertFromImage(
— преобразует экземпляр класса
QImage в экземпляр класса
QPixmap
. Метод возвращает значение
True
, если изображение успешно преобразовано, и
False
— в противном случае;
fromImage(
— преобразует экземпляр класса
QImage в эк- земпляр класса
QPixmap
, который и возвращает. Метод является статическим;
toImage()
— преобразует экземпляр класса
QPixmap в экземпляр класса
QImage и возвра- щает его;
fill([color=white])
— производит заливку изображения указанным цветом;
width()
— возвращает ширину изображения;
height()
— возвращает высоту изображения;
size()
— возвращает экземпляр класса
QSize с размерами изображения;
rect()
— возвращает экземпляр класса
QRect с координатами и размерами прямоуголь- ной области, ограничивающей изображение;
depth()
— возвращает глубину цвета;
isQBitmap()
— возвращает значение
True
, если глубина цвета равна одному биту (т. е. это монохромное изображение), и
False
— в противном случае;
createMaskFromColor(
— создает на основе изображения маску в виде экземпляра класса
QBitmap и возвращает ее. Первый параметр задает цвет — области, закрашенные этим цветом, будут на маске либо прозрачными, либо не- прозрачными. Необязательный параметр mode задает режим создания маски в виде сле- дующих атрибутов класса
QtCore.Qt
:
•
MaskInColor
—
0
— области, закрашенные указанным цветом, будут прозрачными;
•
MaskOutColor
—
1
— области, закрашенные указанным цветом, будут непрозрачными;
setMask(
— устанавливает маску;
mask()
— возвращает экземпляр класса
QBitmap с маской изображения;
copy()
— возвращает экземпляр класса
QPixmap с фрагментом изображения. Если пара- метр rect не указан, изображение копируется полностью. Форматы метода: copy([rect=QRect()]) copy(
scaled()
— изменяет размер изображения и возвращает результат в виде экземпляра класса
QPixmap
. Исходное изображение не изменяется. Форматы метода:
Глава 24. Работа с графикой
577 scaled(<Ширина>, <Высота>[, aspectRatioMode=IgnoreAspectRatio][, transformMode=FastTransformation]) scaled(
В необязательном параметре aspectRatioMode могут быть указаны следующие атрибуты класса
QtCore.Qt
:
•
IgnoreAspectRatio
—
0
— изменяет размеры без сохранения пропорций сторон;
•
KeepAspectRatio
—
1
— изменяет размеры с сохранением пропорций сторон. При этом часть области нового изображения может оказаться незаполненной;
•
KeepAspectRatioByExpanding
—
2
— изменяет размеры с сохранением пропорций сторон. При этом часть нового изображения может выйти за пределы его области.
В необязательном параметре transformMode могут быть указаны следующие атрибуты из класса
QtCore.Qt
:
•
FastTransformation
—
0
— сглаживание выключено;
•
SmoothTransformation
—
1
— сглаживание включено;
scaledToWidth(<Ширина>[, mode=FastTransformation])
— изменяет ширину изображе- ния и возвращает результат в виде экземпляра класса
QPixmap
. Высота изображения из- меняется пропорционально. Исходное изображение не изменяется. Параметр mode анало- гичен параметру transformMode в методе scaled()
;
scaledToHeight(<Высота>[, mode=FastTransformation])
— изменяет высоту изображе- ния и возвращает результат в виде экземпляра класса
QPixmap
. Ширина изображения из- меняется пропорционально. Исходное изображение не изменяется. Параметр mode анало- гичен параметру transformMode в методе scaled()
;
transformed(
— производит трансформацию изображения (например, поворот) и возвращает результат в виде экземпляра класса
QPixmap
. Исходное изображение не изменяется. Трансформация задается с помощью эк- земпляра класса
QTransform
. Параметр mode аналогичен параметру transformMode в ме- тоде scaled()
;
swap(
— заменяет текущее изображение указанным в параметре;
hasAlpha()
— возвращает
True
, если изображение имеет прозрачные области, и
False
— в противном случае;
hasAlphaChannel()
— возвращает
True
, если формат изображения поддерживает про- зрачность, и
False
— в противном случае.
24.3.2. Класс QBitmap
Класс
QBitmap предназначен для работы в контекстно-зависимом представлении с моно- хромными изображениями, имеющими глубину цвета, равную одному биту. Наиболее часто класс
QBitmap используется для создания масок изображений. Иерархия наследования:
QPaintDevice — QPixmap — QBitmap
Поскольку класс
QBitmap наследует класс
QPaintDevice
, мы можем использовать его как поверхность для рисования. Цвет пера и кисти задается атрибутами color0
(прозрачный цвет) и color1
(непрозрачный цвет) класса
QtCore.Qt
. Вывести изображение позволяет ме- тод drawPixmap()
класса
QPainter
(см. разд. 24.2.3).
578
Часть II. Библиотека PyQt 5
Форматы конструктора класса:
<Объект> = QBitmap()
<Объект> = QBitmap(<Ширина>, <Высота>)
<Объект> = QBitmap(
<Объект> = QBitmap(<Путь к файлу>[, format=None])
<Объект> = QBitmap(
<Объект> = QBitmap(
Класс
QBitmap наследует все методы класса
QPixmap и определяет следующие дополнитель- ные методы (здесь приведены только нас интересующие — полный их список можно найти на странице https://doc.qt.io/qt-5/qbitmap.html):
fromImage(
— преобразует экземпляр класса
QImage в эк- земпляр класса
QBitmap и возвращает его. Метод является статическим;
transformed(
— производит трансформацию изображения (например, по- ворот) и возвращает экземпляр класса
QBitmap
. Исходное изображение не изменяется.
Трансформация задается экземпляром класса
QTransform
;
clear()
— очищает изображение, устанавливая все биты изображения в значение color0 24.3.3. Класс QImage
Класс
QImage предназначен для работы с изображениями в контекстно-независимом пред- ставлении. Иерархия наследования:
QPaintDevice — QImage
Поскольку класс
QImage наследует класс
QPaintDevice
, мы можем использовать его как по- верхность для рисования. Однако следует учитывать, что не на всех форматах изображения можно рисовать,
— для рисования лучше использовать изображение формата
Format_ARGB32_Premultiplied
. Вывести изображение позволяет метод drawImage()
класса
QPainter
(см. разд. 24.2.3).
Форматы конструктора класса:
<Объект> = QImage()
<Объект> = QImage(<Ширина>, <Высота>, <Формат>)
<Объект> = QImage(
<Объект> = QImage(<Путь к файлу>[, <Тип изображения>])
<Объект> = QImage(
Первый конструктор создает пустой объект изображения. Второй и третий конструкторы позволяют указать размеры изображения — если таковые равны нулю, будет создан пустой объект. Четвертый конструктор предназначен для загрузки изображения из файла. Во вто- ром параметре указывается тип изображения в виде строки — если он не указан, формат будет определен по расширению загружаемого файла. Пятый конструктор создает копию изображения.
В параметре
<Формат>
можно указать следующие атрибуты класса
QImage
(здесь приведены только основные — полный их список можно найти на странице https://doc.qt.io/qt-
5/qimage.html#Format-enum):
Format_Invalid
—
0
— неверный формат;
Format_Mono
—
1
— глубина цвета 1 бит;
Глава 24. Работа с графикой
579
Format_MonoLSB
—
2
— глубина цвета 1 бит;
Format_Indexed8
—
3
— глубина цвета 8 битов;
Format_RGB32
—
4
— RGB без альфа-канала, глубина цвета 32 бита;
Format_ARGB32
—
5
— RGB с альфа-каналом, глубина цвета 32 бита;
Format_ARGB32_Premultiplied
—
6
— RGB с альфа-каналом, глубина цвета 32 бита. Этот формат лучше использовать для рисования.
Класс
QImage поддерживает большое количество методов, из которых мы рассмотрим лишь основные (полный их список приведен на странице https://doc.qt.io/qt-5/qimage.html):
isNull()
— возвращает значение
True
, если объект является пустым, и
False
— в про- тивном случае;
load(<Путь к файлу>[, format=None])
— загружает изображение из файла. В первом параметре задается абсолютный или относительный путь к файлу. Во втором параметре указывается формат файла в виде строки — если он не указан, формат определяется по расширению файла. Метод возвращает значение
True
, если изображение успешно за- гружено, и
False
— в противном случае;
loadFromData(
— загружает изображение из экземпляра класса
QByteArray
. В первом параметре можно указать данные, имеющие тип bytes
. Во втором параметре указывается тип изображения в виде строки (например,
"PNG"
). Метод возвращает значение
True
, если изображение успешно загружено, и
False
— в против- ном случае;
fromData(
— загружает изображение из экземпляра класса
QByteArray
. В первом параметре можно указать данные, имеющие тип bytes
. Во втором параметре указывается тип изображения в виде строки (например,
"PNG"
). Метод воз- вращает экземпляр класса
QImage
. Метод является статическим;
save(<Путь к файлу>[, format=None][, quality=-1])
— сохраняет изображение в файл.
В первом параметре указывается абсолютный или относительный путь к файлу. Во вто- ром параметре можно задать формат файла в виде строки — если он не указан, формат определяется по расширению файла. Необязательный параметр quality позволяет задать качество изображения. Можно передать значение в диапазоне от
0
до
100
; значение
-1
указывает качество по умолчанию. Метод возвращает значение
True
, если изображение успешно сохранено, и
False
— в противном случае;
fill(<Цвет>)
— производит заливку изображения определенным цветом. В качестве параметра указывается атрибут цвета (например,
QtCore.Qt.white
), экземпляр класса
QColor или целочисленное значение цвета, получить которое позволяют методы rgb()
и rgba()
класса
QColor
: img.fill(QtCore.Qt.red) img.fill(QtGui.QColor("#ff0000")) img.fill(QtGui.QColor("#ff0000").rgb())
width()
— возвращает ширину изображения;
height()
— возвращает высоту изображения;
size()
— возвращает экземпляр класса
QSize с размерами изображения;
rect()
— возвращает экземпляр класса
QRect с координатами и размерами прямоуголь- ной области, ограничивающей изображение;
580
Часть II. Библиотека PyQt 5
depth()
— возвращает глубину цвета;
format()
— возвращает формат изображения (см. значения параметра
<Формат>
в конст- рукторе класса
QImage
);
setPixel()
— задает цвет указанного пиксела. Форматы метода: setPixel(
В параметре
<Индекс или цвет>
для 8-битных изображений задается индекс цвета в па- литре, а для 32-битных — целочисленное значение цвета, получить которое позволяют методы rgb()
и rgba()
класса
QColor
;
pixel()
— возвращает целочисленное значение цвета указанного пиксела. Это значение можно передать конструктору класса
QColor
, а затем получить значения различных со- ставляющих цвета. Форматы метода: pixel(
convertToFormat()
— преобразует формат изображения (см. значения параметра
<Формат>
в конструкторе класса
QImage
) и возвращает новый экземпляр класса
QImage
. Исходное изображение не изменяется. Форматы метода: convertToFormat(<Формат>[, flags=AutoColor]) convertToFormat(<Формат>, <Таблица цветов>[, flags=AutoColor])
copy()
— возвращает экземпляр класса
QImage с фрагментом изображения. Если пара- метр rect не указан, изображение копируется полностью. Форматы метода: copy([rect=QRect()]) copy(
scaled()
— изменяет размер изображения и возвращает результат в виде экземпляра класса
QImage
. Исходное изображение не изменяется. Форматы метода: scaled(<Ширина>, <Высота>[, aspectRatioMode=IgnoreAspectRatio][, transformMode=FastTransformation]) scaled(
В необязательном параметре aspectRatioMode могут быть указаны следующие атрибуты из класса
QtCore.Qt
:
•
IgnoreAspectRatio
—
0
— изменяет размеры без сохранения пропорций сторон;
•
KeepAspectRatio
—
1
— изменяет размеры с сохранением пропорций сторон. При этом часть области нового изображения может оказаться незаполненной;
•
KeepAspectRatioByExpanding
—
2
— изменяет размеры с сохранением пропорций сторон. При этом часть нового изображения может выйти за пределы его области.
В необязательном параметре transformMode могут быть указаны следующие атрибуты класса
QtCore.Qt
:
•
FastTransformation
—
0
— сглаживание выключено;
•
SmoothTransformation
—
1
— сглаживание включено;
scaledToWidth(<Ширина>[, mode=FastTransformation])
— изменяет ширину изображе- ния и возвращает результат в виде экземпляра класса
QImage
. Высота изображения изме-
Глава 24. Работа с графикой
581 няется пропорционально. Исходное изображение не изменяется. Параметр mode аналоги- чен параметру transformMode в методе scaled()
;
scaledToHeight(<Высота>[, mode=FastTransformation])
— изменяет высоту изображе- ния и возвращает результат в виде экземпляра класса
QImage
. Ширина изображения из- меняется пропорционально. Исходное изображение не изменяется. Параметр mode анало- гичен параметру transformMode в методе scaled()
;
transformed(
— производит трансформацию изображения (например, поворот) и возвращает результат в виде экземпляра класса
QImage
. Исходное изображение не изменяется. Трансформация задается с помощью эк- земпляра класса
QTransform
. Параметр mode аналогичен параметру transformMode в ме- тоде scaled()
;
invertPixels([mode=InvertRgb])
— инвертирует значения всех пикселов в изображении.
В необязательном параметре mode может быть указан атрибут
InvertRgb или
InvertRgba класса
QImage
;
mirrored([horizontal=False][, vertical=True])
— создает зеркальный образ изобра- жения. Метод возвращает экземпляр класса
QImage
. Исходное изображение не изменя- ется.
24.3.4. Класс QIcon
Класс
QIcon представляет значки в различных размерах, режимах и состояниях. Обратите внимание, что он не наследует класс
QPaintDevice
, — следовательно, мы не можем исполь- зовать его как поверхность для рисования. Форматы конструктора:
<Объект> = QIcon()
<Объект> = QIcon(<Путь к файлу>)
<Объект> = QIcon(
<Объект> = QIcon(
Первый конструктор создает пустой объект значка. Второй конструктор выполняет загрузку значка из файла, причем файл загружается при первой попытке использования, а не сразу.
Третий конструктор создает значок на основе экземпляра класса
QPixmap
, а четвертый — создает копию значка.
Класс
QIcon поддерживает следующие методы (здесь приведены только основные — пол- ный их список можно найти на странице https://doc.qt.io/qt-5/qicon.html):
isNull()
— возвращает значение
True
, если объект является пустым, и
False
— в про- тивном случае;
addFile(<Путь к файлу>[, size=QSize()][, mode=Normal][, state=Off])
— добавляет значок для указанного размера, режима и состояния. Можно добавить несколько знач- ков, вызывая метод с разными значениями параметров. Параметр size задает размер значка в виде экземпляра класса
QSize
(т. к. загрузка значка производится при первой попытке использования, заранее размер значка неизвестен, и нам придется задать его явно). В параметре mode можно указать следующие атрибуты класса
QIcon
:
Normal
(обычное состояние компонента),
Disabled
(компонент недоступен),
Active
(компонент активен) или
Selected
(компонент выделен — обычно используется для элементов пред- ставлений). В параметре state указываются атрибуты
Off
(отключенное состояние) или
On
(включенное состояние) класса
QIcon
;
582
Часть II. Библиотека PyQt 5
addPixmap(
— добавляет значок для указанного режима и состояния. Значок создается на основе экземпляра класса
QPixmap
;
availableSizes([mode=Normal][, state=Off])
— возвращает доступные размеры (спи- сок с экземплярами класса
QSize
) значков для указанного режима и состояния;
actualSize(
— возвращает фактический размер
(экземпляр класса
QSize
) для указанного размера, режима и состояния. Фактический размер может быть меньше размера, указанного в первом параметре, но не больше;
pixmap()
— возвращает значок (экземпляр класса
QPixmap
), который примерно соответ- ствует указанному размеру, режиму и состоянию. Форматы метода: pixmap(<Ширина>, <Высота>[, mode=Normal][, state=Off]) pixmap(<Ширина и высота>[, mode=Normal][, state=Off]) pixmap(
Во втором формате первый параметр задает и ширину, и высоту значка (предполагается, что значок имеет квадратную форму).
Вместо загрузки значка из файла можно воспользоваться одним из встроенных в PyQt 5 стандартных значков. Загрузить стандартный значок позволяет следующий код: ico = window.style().standardIcon(QtWidgets.QStyle.SP_MessageBoxCritical)
Найти список всех встроенных значков можно в документации к классу
QStyle на странице https://doc.qt.io/qt-5/qstyle.html#StandardPixmap-enum.
ГЛ А В А
25
Графическая сцена
Графическая сцена позволяет отображать объекты (линии, прямоугольники и др.) и произ- водить с ними различные манипуляции (перемещать с помощью мыши, преобразовывать систему координат и др.). Для отображения графических объектов применяется концепция
«модель-представление», позволяющая отделить данные от их отображения и избежать дублирования данных. Благодаря этому одну и ту же сцену можно отобразить сразу в не- скольких представлениях без дублирования. В основе концепции лежат следующие классы:
QGraphicsScene
— исполняет роль сцены, на которой расположены графические объекты
(модель). Этот класс также поддерживает ряд методов для управления такими объек- тами;
QGraphicsItem
— является базовым классом для графических объектов (элементов мо- дели). Можно наследовать этот класс и реализовать свой графический объект или вос- пользоваться готовыми классами, например:
QGraphicsRectItem
(прямоугольник),
QGraphicsEllipseItem
(эллипс) и др.;
QGraphicsView
— предназначен для отображения сцены (представление). Одну сцену можно отображать с помощью нескольких представлений.
Все описанные в этой главе классы объявлены в модуле
QtWidgets
, если не указано иное.
25.1. Класс QGraphicsScene: сцена
Класс
QGraphicsScene исполняет роль сцены, на которой расположены графические объек- ты, и поддерживает множество методов для управления этими объектами. Иерархия насле- дования выглядит так:
QObject — QGraphicsScene
Форматы конструктора:
<Объект> = QGraphicsScene([parent=None])
<Объект> = QGraphicsScene(
<Объект> = QGraphicsScene(
Первый конструктор создает сцену, не имеющую определенного размера. Второй и третий конструкторы позволяют указать размеры сцены в виде вещественных чисел или экземпля- ра класса
QRectF
. В качестве параметра parent можно указать ссылку на родительский ком- понент.
584
Часть II. Библиотека PyQt 5 25.1.1. Настройка сцены
Для настройки различных параметров сцены предназначены следующие методы класса
QGraphicsScene
:
setSceneRect()
— задает координаты и размеры сцены. Форматы метода: setSceneRect(
sceneRect()
— возвращает экземпляр класса
QRectF
с координатами и размерами сцены;
width()
и height()
— возвращают ширину и высоту сцены соответственно в виде веще- ственного числа;
itemsBoundingRect()
— возвращает экземпляр класса
QRectF
с координатами и размера- ми прямоугольника, в который вписываются все объекты, расположенные на сцене;
setBackgroundBrush(
— задает кисть для заднего плана (фона), расположенно- го под графическими объектами. Чтобы изменить задний план, также можно переопре- делить у сцены метод drawBackground()
и выполнять перерисовку заднего плана при каждом вызове внутри него;
setForegroundBrush(
— задает кисть для переднего плана, расположенного над графическими объектами. Чтобы изменить передний план, также можно переопределить у сцены метод drawForeground()
и внутри него выполнять перерисовку переднего плана при каждом вызове;
setFont(
— задает шрифт сцены по умолчанию;
setItemIndexMethod(<Режим>)
— задает режим индексации объектов сцены. В качестве параметра указываются следующие атрибуты класса
QGraphicsScene
:
•
BspTreeIndex
—
0
— для поиска объектов используется индекс в виде бинарного дерева. Этот режим следует применять для сцен, большинство объектов которых являются статическими;
•
NoIndex
—
-1
— индекс не используется. Этот режим следует применять для сцен, содержимое которых часто меняется;
setBspTreeDepth(<Число>)
— задает глубину дерева при использовании режима
BspTreeIndex
. По умолчанию установлено значение
0
, которое говорит, что глубина вы- бирается автоматически;
bspTreeDepth()
— возвращает текущее значение глубины дерева при использовании режима
BspTreeIndex
25.1.2. Добавление и удаление графических объектов
Для добавления графических объектов на сцену и удаления их оттуда предназначены сле- дующие методы класса
QGraphicsScene
:
addItem(
— добавляет графический объект на сцену. В качестве значе- ния указывается экземпляр класса, наследующего класс
QGraphicsItem
, — например,
QGraphicsEllipseItem
(эллипс);
addLine()
— создает линию, добавляет ее на сцену и возвращает ссылку на представ- ляющий ее экземпляр класса
QGraphicsLineItem
. Форматы метода:
Глава 25. Графическая сцена
585 addLine(
addRect()
— создает прямоугольник, добавляет его на сцену и возвращает ссылку на представляющий его экземпляр класса
QGraphicsRectItem
. Форматы метода: addRect(
addPolygon(
— создает многоугольник, добавляет его на сцену и возвращает ссылку на представляющий его экземпляр класса
QGraphicsPolygonItem
;
addEllipse()
— создает эллипс, добавляет его на сцену и возвращает ссылку на пред- ставляющий его экземпляр класса
QGraphicsEllipseItem
. Форматы метода: addEllipse(
addPixmap(
— создает изображение, добавляет его на сцену и возвращает ссылку на представляющий его экземпляр класса
QGraphicsPixmapItem
;
addSimpleText(<Текст>[, font=QFont()])
— создает фрагмент простого текста, добавля- ет его на сцену в позицию с координатами
(0, 0)
и возвращает ссылку на представляю- щий его экземпляр класса
QGraphicsSimpleTextItem
;
addText(<Текст>[, font=QFont()])
— создает фрагмент форматированного текста, до- бавляет его на сцену в позицию с координатами
(0, 0)
и возвращает ссылку на пред- ставляющий его экземпляр класса
QGraphicsTextItem
;
addPath(
— создает сложную фигуру
(«путь»), добавляет ее на сцену и возвращает ссылку на представляющий ее экземпляр класса
QGraphicsPathItem
;
removeItem(
— убирает графический объект и всех его потомков со сцены. Графический объект при этом не удаляется и, например, может быть добавлен на другую сцену. В качестве значения указывается экземпляр класса, который наследует класс
QGraphicsItem
, например,
QGraphicsEllipseItem
(эллипс);
clear()
— удаляет все элементы со сцены. Метод является слотом;
createItemGroup(<Список с объектами>)
— группирует объекты, добавляет группу на сце- ну и возвращает представляющий созданную группу экземпляр класса
QGraphicsItemGroup
;
destroyItemGroup(
— удаляет группу со сцены, при этом сохра- няя все содержащиеся в группе элементы.
25.1.3. Добавление компонентов на сцену
Помимо графических объектов, на сцену можно добавить компоненты, которые будут функционировать как обычно. Добавить компонент на сцену позволяет метод addWidget()
класса
QGraphicsScene
. Формат метода: addWidget(
В первом параметре указывается экземпляр класса, который наследует класс
QWidget
. Во втором параметре задается тип окна (см. разд. 18.2). Метод возвращает ссылку на экземпляр класса
QGraphicsProxyWidget
, представляющий добавленный компонент.
586
Часть II. Библиотека PyQt 5 25.1.4. Поиск объектов
Для поиска графических объектов, находящихся на сцене, предназначены следующие мето- ды класса
QGraphicsScene
:
itemAt()
— возвращает ссылку на верхний видимый объект, который расположен по указанным координатам, или значение
None
, если никакого объекта там нет. Форматы метода: itemAt(
Третий параметр задает примененные к сцене преобразования системы координат
(см. разд. 24.2.4). Его необходимо указывать, если на сцене присутствуют объекты, игнорирующие преобразования. В противном случае следует указать пустой экземпляр класса
QTransform
;
collidingItems(
— возвращает список со ссылками на объекты, которые находятся в указанном в первом параметре объекте или пересекаются с ним. Если таких объектов нет, метод возвращает пустой список. Не- обязательный параметр mode указывает режим поиска графических объектов и должен задаваться следующими атрибутами класса
QtCore.Qt
:
•
ContainsItemShape
—
0
— ищутся объекты, чьи границы полностью находятся внут- ри заданного объекта;
•
IntersectsItemShape
—
1
— ищутся объекты, чьи границы полностью находятся внутри заданного объекта или пересекаются с его границей;
•
ContainsItemBoundingRect
—
2
— ищутся объекты, чьи охватывающие прямоуголь- ники (т. е. прямоугольники минимальных размеров, в которые искомые объекты по- мещаются полностью) полностью находятся внутри охватывающего прямоугольника заданного объекта;
•
IntersectsItemBoundingRect
—
3
— ищутся объекты, чьи охватывающие прямо- угольники (т. е. прямоугольники минимальных размеров, в которые искомые объек- ты помещаются полностью) полностью находятся внутри охватывающего прямо- угольника заданного объекта или пересекаются с его границами;
items()
— возвращает список со ссылками на все объекты или на объекты, расположен- ные по указанным координатам, или на объекты, попадающие в указанную область.
Если объектов нет, то возвращается пустой список. Форматы метода: items([order=DescendingOrder]) items(
Глава 25. Графическая сцена
587
В необязательном параметре order
, задающем порядок сортировки объектов, указыва- ются атрибуты
AscendingOrder
(в алфавитном порядке) или
DescendingOrder
(в обратном порядке) класса
QtCore.Qt
В необязательном параметре mode указываются следующие атрибуты класса
QtCore.Qt
:
•
ContainsItemShape
—
0
— объект попадет в список, если все точки объекта находятся внутри заданной области;
•
IntersectsItemShape
—
1
— объект попадет в список, если любая точка объекта по- падает в заданную область;
•
ContainsItemBoundingRect
—
2
— объект попадет в список, если охватывающий пря- моугольник полностью находится внутри заданной области;
•
IntersectsItemBoundingRect
—
3
— объект попадет в список, если любая точка охва- тывающего прямоугольника попадает в заданную область.
Необязательный параметр deviceTransform задает примененные к сцене преобразования системы координат (см. разд. 24.2.4). Его необходимо указывать, если на сцене присут- ствуют объекты, игнорирующие преобразования.
25.1.5. Управление фокусом ввода
Получить фокус ввода с клавиатуры может как сцена в целом, так и отдельный объект на ней. Если фокус установлен на отдельный объект, все события клавиатуры перенаправля- ются этому объекту. Чтобы объект мог принимать фокус ввода, необходимо установить флаг
ItemIsFocusable
, например, с помощью метода setFlag()
класса
QGraphicsItem
. Для управления фокусом ввода предназначены следующие методы этого класса:
setFocus([focusReason=OtherFocusReason])
— устанавливает фокус ввода на сцену. В па- раметре focusReason можно указать причину изменения фокуса ввода (см. разд. 19.8.1);
setFocusItem(
— устанавливает фокус ввода на указанный графический объект на сцене. Если сцена была вне фокуса ввода, она автоматически получит фокус. Если в первом параметре указано значение
None
, или объект не может принимать фокус, метод просто убирает фокус с объекта, обладающего им в текущий момент. В параметре focusReason можно указать причину изменения фокуса ввода (см. разд. 19.8.1);
clearFocus()
— убирает фокус ввода со сцены. Объект, который обладает фокусом вво- да в текущий момент, потеряет его, но получит его снова, когда фокус будет опять уста- новлен на сцену;
hasFocus()
— возвращает значение
True
, если сцена имеет фокус ввода, и
False
— в противном случае;
focusItem()
— возвращает ссылку на объект, который обладает фокусом ввода, или зна- чение
None
;
setStickyFocus(<Флаг>)
— если в качестве параметра указано значение
True
, то при щелчке мышью на фоне сцены или на объекте, который не может принимать фокус, объект, владеющий фокусом, не потеряет его. По умолчанию фокус убирается;
stickyFocus()
— возвращает значение
True
, если фокус ввода не будет убран с объекта при щелчке мышью на фоне или на объекте, который не может принимать фокус.
588
Часть II. Библиотека PyQt 5 25.1.6. Управление выделением объектов
Чтобы объект можно было выделить (с помощью мыши или программно), необходимо установить флаг
ItemIsSelectable
, например, с помощью метода setFlag()
класса
QGraphicsItem
. Для управления выделением объектов предназначены следующие методы этого класса:
setSelectionArea()
— выделяет объекты внутри указанной области. Чтобы выделить только один объект, следует воспользоваться методом setSelected()
класса
QGraphicsItem
. Форматы метода setSelectionArea()
: setSelectionArea(
В необязательном параметре mode могут быть указаны следующие атрибуты класса
QtCore.Qt
:
•
ContainsItemShape
—
0
— объект будет выделен, если все точки объекта находятся внутри области выделения;
•
IntersectsItemShape
—
1
— объект будет выделен, если любая точка объекта попа- дет в область выделения;
•
ContainsItemBoundingRect
—
2
— объект будет выделен, если охватывающий прямо- угольник полностью находится внутри области выделения;
•
IntersectsItemBoundingRect
—
3
— объект будет выделен, если любая точка охваты- вающего прямоугольника попадет в область выделения.
Второй параметр первого формата и параметр deviceTransform второго формата задают примененные к сцене преобразования системы координат (см. разд. 24.2.4).
Третий формат позволяет дополнительно указать, какое преобразование (параметр
<Операция>
) следует выполнить с ранее выделенными объектами сцены. В качестве па- раметра
<Операция>
задается один из следующих атрибутов класса
QtCore.Qt
:
•
ReplaceSelection
—
0
— ранее выделенные объекты перестанут быть выделенными;
•
AddToSelection
—
1
— ранее выделенные объекты останутся выделенными.
Этот формат поддерживается, начиная с PyQt 5.5;
selectionArea()
— возвращает область выделения в виде экземпляра класса
QPainterPath
;
selectedItems()
— возвращает список со ссылками на выделенные объекты или пустой список, если выделенных объектов нет;
clearSelection()
— снимает выделение. Метод является слотом.
25.1.7. Прочие методы и сигналы
Помимо рассмотренных ранее, класс
QGraphicsScene поддерживает следующие методы
(здесь приведены только основные — полный их список можно найти на странице https:// doc.qt.io/qt-5/qgraphicsscene.html
):
isActive()
— возвращает значение
True
, если сцена отображается на экране с помощью какого-либо представления, и
False
— в противном случае;
Глава 25. Графическая сцена
589
views()
— возвращает список с представлениями (экземпляры класса
QGraphicsView
), в которых выводится сцена. Если сцена вообще не выводится на экран, возвращается пустой список;
mouseGrabberItem()
— возвращает ссылку на объект, который владеет мышью, или
None
, если такого объекта нет;
render()
— позволяет вывести содержимое сцены на устройство рисования или прин- тер. Формат метода: render(
Параметр target задает координаты и размеры устройства рисования, а параметр source
— координаты и размеры прямоугольной области на сцене. Если параметры не указаны, используются размеры устройства рисования и сцены. В параметре mode
, задающем режим изменения размеров графики при выводе, могут быть указаны сле- дующие атрибуты класса
QtCore.Qt
:
•
IgnoreAspectRatio
—
0
— изменяет размеры без сохранения пропорций сторон;
•
KeepAspectRatio
—
1
— изменяет размеры с сохранением пропорций сторон. При этом часть области на устройстве рисования может оказаться незаполненной;
•
KeepAspectRatioByExpanding
—
2
— изменяет размеры с сохранением пропорций сторон. При этом часть выводимой графики может выйти за пределы области на устройстве рисования;
invalidate()
— вызывает перерисовку указанных слоев внутри прямоугольной области на сцене. Форматы метода: invalidate(
В параметре layers
, задающем слои, которые требуется перерисовать, могут быть указа- ны следующие атрибуты класса
QGraphicsScene
:
•
ItemLayer
—
1
— слой объекта;
•
BackgroundLayer
—
2
— слой заднего плана;
•
ForegroundLayer
—
4
— слой переднего плана;
•
AllLayers
—
65535
— все слои. Вначале отрисовывается слой заднего плана, затем — слой объекта и в конце — слой переднего плана.
Второй формат метода является слотом;
update()
— вызывает перерисовку указанной прямоугольной области сцены. Форматы метода: update(
Второй формат метода является слотом.
Класс
QGraphicsScene поддерживает следующие сигналы:
changed(<Список областей>)
— генерируется при изменении сцены. Внутри обработчика через параметр доступен список с экземплярами класса
QRectF
, представляющими изме- нившиеся области сцены;
sceneRectChanged(
— генерируется при изменении размеров сцены. Внутри обработчика через параметр доступен экземпляр класса
QRectF
с новыми координатами и размерами сцены;
590
Часть II. Библиотека PyQt 5
selectionChanged()
— генерируется при изменении выделения объектов;
focusItemChanged(
— генерируется при изменении фокуса клавиатурного ввода. Через параметры доступны объект, получивший фокус ввода, объект, потерявший фокус ввода, и причина измене- ния фокуса (см. разд. 19.8.1).
25.2. Класс QGraphicsView: представление
Класс
QGraphicsView предназначен для отображения сцены. Одну сцену можно отображать с помощью нескольких представлений. Иерархия наследования:
(QObject, QPaintDevice) — QWidget — QFrame — QAbstractScrollArea — QGraphicsView
Форматы конструктора класса:
<Объект> = QGraphicsView([parent=None])
<Объект> = QGraphicsView(
Второй формат сразу же позволяет установить в представлении сцену, которая будет выво- диться на экран.
25.2.1. Настройка представления
Для настройки различных параметров представления применяются следующие методы класса
QGraphicsView
(здесь приведены только основные — полный их список можно найти на странице https://doc.qt.io/qt-5/qgraphicsview.html):
setScene(
— устанавливает выводимую на экран сцену;
scene()
— возвращает ссылку на установленную сцену в виде экземпляра класса
QGraphicsScene
;
setSceneRect()
— задает координаты и размеры сцены. Форматы метода: setSceneRect(
sceneRect()
— возвращает экземпляр класса
QRectF
с координатами и размерами сцены;
setBackgroundBrush(
— задает кисть для заднего плана (фона) сцены (распо- ложен под графическими объектами);
setForegroundBrush(
— задает кисть для переднего плана сцены (расположен над графическими объектами);
setCacheMode(<Режим>)
— задает режим кэширования выводимых объектов. В качестве параметра могут быть указаны следующие атрибуты класса
QGraphicsView
:
•
CacheNone
—
0
— без кэширования;
•
CacheBackground
—
1
— кэшируется только задний фон;
resetCachedContent()
— сбрасывает кэш;
setAlignment(<Выравнивание>)
— задает выравнивание сцены в случае, если содержимое сцены полностью помещается в представлении. По умолчанию сцена центрируется по горизонтали и вертикали. Вот пример установки сцены в левом верхнем углу представ- ления: view.setAlignment(QtCore.Qt.AlignLeft | QtCore.Qt.AlignTop)
Глава 25. Графическая сцена
591
setInteractive(<Флаг>)
— если в качестве параметра указано значение
True
, пользова- тель может взаимодействовать с объектами на сцене (интерактивный режим, использу- ется по умолчанию). Значение
False разрешает только просмотр сцены;
isInteractive()
— возвращает значение
True
, если задан интерактивный режим, и
False
— в противном случае;
setDragMode(<Режим>)
— задает действие, которое производится при щелчке левой кнопкой мыши на фоне и перемещении мыши. Получить текущее действие позволяет метод dragMode()
. В качестве параметра могут быть указаны следующие атрибуты клас- са
QGraphicsView
:
•
NoDrag
—
0
— ничего не происходит;
•
ScrollHandDrag
—
1
— перемещение мыши при нажатой левой кнопке будет приво- дить к прокрутке сцены. При этом указатель мыши примет вид сжатой или разжатой руки;
•
RubberBandDrag
—
2
— создается область выделения. Объекты, частично или пол- ностью (задается с помощью метода setRubberBandSelectionMode()
) попавшие в эту область, будут выделены (при условии, что установлен флаг
ItemIsSelectable
). Дей- ствие выполняется только в интерактивном режиме;
setRubberBandSelectionMode(<Режим>)
— задает режим выделения объектов при уста- новленном флаге
RubberBandDrag
. В параметре
<Режим>
могут быть указаны следующие атрибуты класса
QtCore.Qt
:
•
ContainsItemShape
—
0
— объект будет выделен, если все точки объекта находятся внутри области выделения;
•
IntersectsItemShape
—
1
— объект будет выделен, если любая точка объекта попа- дет в область выделения;
•
ContainsItemBoundingRect
—
2
— объект будет выделен, если охватывающий прямо- угольник полностью находится внутри области выделения;
•
IntersectsItemBoundingRect
—
3
— объект будет выделен, если любая точка охваты- вающего прямоугольника попадет в область выделения;
setRenderHint(<Опция вывода>[, <Флаг>])
— управляет опциями, влияющими на каче- ство отображения сцены. Если вторым параметром передано значение
True
, или если второй параметр вообще не указан,
<Опция вывода>
активизируется, если же передано
False
, опция деактивируется. Сама
<Опция вывода>
указывается в виде одного из сле- дующих атрибутов класса
QPainter
:
•
Antialiasing
—
1
— выполнять сглаживание краев у графических объектов;
•
TextAntialiasing
—
2
— выполнять сглаживание текста. Активизирован по умолча- нию;
•
SmoothPixmapTransform
—
4
— использовать более качественное сглаживание при трансформациях растровых изображений;
•
Qt4CompatiblePainting
—
32
— использовать тот же способ сглаживания, что приме- нялся в PyQt 4. Присутствует для совместимости.
Вот пример активизирования для представления всех доступных опций вывода: view.setRenderHint(QtGui.QPainter.Antialiasing) view.setRenderHint(QtGui.QPainter.TestAntialiasing) view.setRenderHint(QtGui.QPainter.SmoothPixmapTransform)
592
Часть II. Библиотека PyQt 5
setRenderHints(<Опции вывода>)
— активизирует сразу все указанные
<Опции вывода>
(те, что не были указаны, деактивируются).
<Опции вывода>
задаются в виде комбинации описанных ранее атрибутов класса
QPainter
, перечисленных через оператор
|
Вот пример активизирования для представления всех доступных опций: view.setRenderHints(QtGui.QPainter.Antialiasing |
QtGui.QPainter.TestAntialiasing |
QtGui.QPainter.SmoothPixmapTransform)
25.2.2. Преобразования между координатами представления и сцены
Для преобразования между координатами представления и сцены предназначены следую- щие методы класса
QGraphicsView
:
mapFromScene()
— преобразует координаты точки из системы координат сцены в сис- тему координат представления. Форматы метода (справа указан тип возвращаемого зна- чения): mapFromScene(
mapToScene()
— преобразует координаты точки из системы координат представления в систему координат сцены. Форматы метода (справа указан тип возвращаемого значе- ния): mapToScene(
25.2.3. Поиск объектов
Для поиска объектов на сцене предназначены следующие методы:
itemAt()
— возвращает ссылку на верхний видимый объект, который расположен по указанным координатам, или значение
None
, если никакого объекта там нет. В качестве значений указываются координаты в системе координат представления, а не сцены.
Форматы метода: itemAt(
items()
— возвращает список со ссылками на все объекты, или на объекты, располо- женные по указанным координатам, или на объекты, попадающие в указанную область.
Если объектов нет, возвращается пустой список. В качестве значений указываются координаты в системе координат представления, а не сцены. Форматы метода:
Глава 25. Графическая сцена
593 items() items(
Допустимые значения параметра mode мы уже рассматривали в разд. 25.1.4.
25.2.4. Преобразование системы координат
Выполнить преобразование системы координат позволяют следующие методы класса
QGraphicsView
:
translate(
— перемещает начало координат в указанную точку. По умол- чанию начало координат находится в левом верхнем углу, ось
X
направлена вправо, а ось
Y
— вниз;
rotate(<Угол>)
— поворачивает систему координат на указанное количество градусов
(указывается вещественное число). Положительное значение вызывает поворот по часо- вой стрелке, а отрицательное значение — против часовой стрелки;
scale(<По оси X>, <По оси Y>)
— масштабирует систему координат. В качестве значе- ний указываются вещественные числа. Если значение меньше единицы, то выполняется уменьшение, а если больше единицы — то увеличение;
shear(<По горизонтали>, <По вертикали>)
— сдвигает систему координат. В качестве значений указываются вещественные числа;
resetTransform()
— отменяет все преобразования.
Несколько преобразований можно произвести последовательно друг за другом. При этом надо учитывать, что порядок следования преобразований имеет значение.
Если одна и та же последовательность выполняется несколько раз, то ее можно сохранить в экземпляре класса
QTransform
, а затем установить с помощью метода setTransform()
. По- лучить ссылку на установленную матрицу позволяет метод transform()
25.2.5. Прочие методы
Помимо рассмотренных ранее, класс
QGraphicsView поддерживает следующие методы
(Здесь приведены только основные — полный их список можно найти на странице https://doc.qt.io/qt-5/qgraphicsview.html
):
centerOn()
— прокручивает область таким образом, чтобы указанная точка или объект находились в центре видимой области представления. Форматы метода: centerOn(
ensureVisible()
— прокручивает область таким образом, чтобы указанный прямоуголь- ник или объект находились в видимой области представления. Форматы метода: ensureVisible(
594
Часть II. Библиотека PyQt 5
Необязательные параметры xMargin и yMargin задают минимальные значения просветов между границами графического объекта и краями представления по горизонтали и вер- тикали соответственно;
fitInView()
— прокручивает и масштабирует область таким образом, чтобы указанный прямоугольник или объект занимали всю видимую область представления. Форматы метода: fitInView(
Необязательный параметр mode задает режим изменения размеров. Его значения рас- сматривались в разд. 25.1.7 (см. описание метода render()
класса
QGraphicsScene
);
render()
— позволяет вывести содержимое представления на устройство рисования или принтер. Формат метода: render(
Назначение параметров этого метода сходно с таковым у метода render()
класса
QGraphicsScene
(см. разд. 25.1.7);
invalidateScene([rect=QRectF()][, layers=AllLayers])
— вызывает перерисовку ука- занных слоев внутри прямоугольной области на сцене. Назначение его параметров сход- но с таковым у одноименного метода класса
QGraphicsScene
(см. разд. 25.1.7). Метод является слотом;
updateSceneRect(
— вызывает перерисовку указанной прямоугольной области сцены. Метод является слотом;
updateScene(<Список с экземплярами класса QRectF>)
— вызывает перерисовку указан- ных прямоугольных областей. Метод является слотом.
25.3. Класс QGraphicsItem: базовый класс для графических объектов
Абстрактный класс
QGraphicsItem является базовым классом для графических объектов.
Формат конструктора класса:
QGraphicsItem([parent=None])
В параметре parent может быть указана ссылка на родительский объект (экземпляр класса, наследующего класс
QGraphicsItem
).
Поскольку класс
QGraphicsItem является абстрактным, создать его экземпляр нельзя. Чтобы создать новый графический объект, следует наследовать этот класс и переопределить, как минимум, методы boundingRect()
и paint()
. Метод boundingRect()
должен возвращать экземпляр класса
QRectF
с координатами и размерами прямоугольной области, ограничи- вающей объект. Внутри метода paint()
необходимо выполнить рисование объекта. Формат метода paint()
: paint(self,
Для обработки столкновений следует также переопределить метод shape()
. Метод должен возвращать экземпляр класса
QPainterPath
Глава 25. Графическая сцена
595 25.3.1. Настройка объекта
Для настройки различных параметров объекта предназначены следующие методы класса
QGraphicsItem
(здесь приведены только основные — полный их список можно найти на странице https://doc.qt.io/qt-5/qgraphicsitem.html):
setPos()
— задает позицию объекта относительно родителя или сцены (при отсутствии родителя). Форматы метода: setPos(
pos()
— возвращает экземпляр класса
QPointF
с текущими координатами относительно родителя или сцены (при отсутствии родителя);
scenePos()
— возвращает экземпляр класса
QPointF
с текущими координатами относи- тельно сцены;
sceneBoundingRect()
— возвращает экземпляр класса
QRectF
, который содержит коор- динаты (относительно сцены) и размеры прямоугольника, ограничивающего объект;
setX(
и setY(
— задают позицию объекта по отдельным осям;
x()
и y()
— возвращают позицию объекта по отдельным осям;
setZValue(
— задает позицию объекта по оси
Z
. Объект с бо´льшим значением этого параметра рисуется выше объекта с меньшим значением. По умолчанию для всех объек- тов значение позиции по оси
Z
равно
0.0
;
zValue()
— возвращает позицию объекта по оси
Z
;
moveBy(<По оси X>, <По оси Y>)
— сдвигает объект на указанное смещение относи- тельно текущей позиции;
prepareGeometryChange()
— этот метод следует вызвать перед изменением размеров объекта, чтобы поддержать индекс сцены в актуальном состоянии;
scene()
— возвращает ссылку на сцену (экземпляр класса
QGraphicsScene
) или значение
None
, если объект не помещен на сцену;
setFlag(<Флаг>[, enabled=True])
— устанавливает (если второй параметр имеет значе- ние
True
) или сбрасывает (если второй параметр имеет значение
False
) указанный флаг.
В первом параметре могут быть указаны следующие атрибуты класса
QGraphicsItem
(здесь приведены только основные — полный их список можно найти на странице https://doc.qt.io/qt-5/qgraphicsitem.html#GraphicsItemFlag-enum
):
•
ItemIsMovable
—
0x1
— объект можно перемещать с помощью мыши;
•
ItemIsSelectable
—
0x2
— объект можно выделять;
•
ItemIsFocusable
—
0x4
— объект может получить фокус ввода;
•
ItemIgnoresTransformations
—
0x20
— объект игнорирует наследуемые преобразо- вания;
•
ItemIgnoresParentOpacity
—
0x40
— объект игнорирует прозрачность родителя;
•
ItemDoesntPropagateOpacityToChildren
—
0x80
— прозрачность объекта не распро- страняется на потомков;
•
ItemStacksBehindParent
—
0x100
— объект располагается позади родителя;
•
ItemIsPanel
—
0x4000
— объект является панелью;
596
Часть II. Библиотека PyQt 5
setFlags(<Флаги>)
— устанавливает сразу несколько флагов. Атрибуты (см. описание метода setFlag()
) указываются через оператор
|
;
flags()
— возвращает комбинацию установленных флагов (см. описание метода setFlag()
);
setOpacity(<Число>)
— задает степень прозрачности объекта. В качестве значения ука- зывается вещественное число от
0.0
(полностью прозрачный) до
1.0
(полностью непро- зрачный);
opacity()
— возвращает степень прозрачности объекта;
setToolTip(<Текст>)
— задает текст всплывающей подсказки;
setCursor(<Курсор>)
— задает внешний вид указателя мыши при наведении указателя на объект (см. разд. 19.9.5);
unsetCursor()
— отменяет изменение указателя мыши;
setVisible(<Флаг>)
— если в качестве параметра указано значение
True
, то объект будет видим. Значение
False скрывает объект;
show()
— делает объект видимым;
hide()
— скрывает объект;
isVisible()
— возвращает значение
True
, если объект видим, и
False
— если скрыт;
setEnabled(<Флаг>)
— если в качестве параметра указано значение
True
, объект будет доступен. Значение
False делает объект недоступным. Недоступный объект не получает никаких событий, и его нельзя выделить;
isEnabled()
— возвращает значение
True
, если объект доступен, и
False
— если недос- тупен;
setSelected(<Флаг>)
— если в качестве параметра указано значение
True
, объект будет выделен. Значение
False снимает выделение. Чтобы объект можно было выделить, необходимо установить флаг
ItemIsSelectable
, например, с помощью метода setFlag()
класса
QGraphicsItem
;
isSelected()
— возвращает значение
True
, если объект выделен, и
False
— в противном случае;
setFocus([focusReason=OtherFocusReason])
— устанавливает фокус ввода на объект. В па- раметре focusReason можно указать причину изменения фокуса ввода (см. разд. 19.8.1).
Чтобы объект мог принимать фокус ввода, необходимо установить флаг
ItemIsFocusable
, например, с помощью метода setFlag()
класса
QGraphicsItem
;
clearFocus()
— убирает фокус ввода с объекта;
hasFocus()
— возвращает значение
True
, если объект находится в фокусе ввода, и
False
— в противном случае;
grabKeyboard()
— захватывает ввод с клавиатуры;
ungrabKeyboard()
— освобождает ввод с клавиатуры;
grabMouse()
— захватывает мышь;
ungrabMouse()
— освобождает мышь.
Глава 25. Графическая сцена
597 25.3.2. Выполнение преобразований
Задать преобразования для графического объекта можно, воспользовавшись классом
QTransform
. Для работы с преобразованиями, заданными экземплярами этого класса, класс
QGraphicsItem поддерживает следующие методы:
setTransform(
— устанавливает преобразования, задан- ные в первом параметре. Если вторым параметром передать значение
True
, новые пре- образования будут объединены с уже установленными, — в противном случае они заме- нят установленные ранее преобразования;
transform()
— возвращает экземпляр класса
QTransform
, представляющий заданные для объекта преобразования;
sceneTransform()
— возвращает экземпляр класса
QTransform
, который представляет преобразования, заданные для самой графической сцены.
Есть и более простой способ задания преобразований — использование следующих методов класса
QGraphicsItem
:
setTransformOriginPoint()
— перемещает начало координат в указанную точку. Форма- ты метода: setTransformOriginPoint(
setRotation(<Угол>)
— поворачивает систему координат на указанное количество гра- дусов (указывается вещественное число): положительное значение вызывает поворот по часовой стрелке, а отрицательное — против часовой стрелки;
rotation()
— возвращает текущий угол поворота;
setScale(<Значение>)
— масштабирует систему координат. В качестве значений указы- ваются вещественные числа: если значение меньше единицы, выполняется уменьшение, а если больше — увеличение;
scale()
— возвращает текущий масштаб;
resetTransform()
— отменяет все преобразования.
25.3.3. Прочие методы
Помимо рассмотренных ранее, класс
QGraphicsItem поддерживает следующие полезные для нас методы (полный их список можно найти на странице https://doc.qt.io/qt-5/ qgraphicsitem.html
):
setParentItem(
— задает родителя для текущего объекта. Местополо- жение дочернего объекта задается в координатах родительского объекта;
parentItem()
— возвращает ссылку на родительский объект;
topLevelItem()
— возвращает ссылку на родительский объект верхнего уровня;
childItems()
— возвращает список с дочерними объектами;
contains(
— возвращает
True
, если точка с указанными координатами (эк- земпляр класса
QPointF
) входит в состав графического объекта, и
False
— в противном случае;
collidingItems([mode=IntersectsItemShape])
— возвращает список со ссылками на объ- екты, которые находятся в текущем объекте или пересекаются с ним. Если таких объектов нет, возвращается пустой список. Возможные значения параметра mode см. в разд. 25.1.4;
598
Часть II. Библиотека PyQt 5
collidesWithItem(
— возвращает значе- ние
True
, если объект находится в объекте, указанном в первом параметре, или пересе- кается с ним. Возможные значения параметра mode см. в разд. 25.1.4;
collidesWithPath(
— возвращает значе- ние
True
, если объект находится внутри пути, указанного в первом параметре, или пере- секается с ним. Возможные значения параметра mode см. в разд. 25.1.4;
ensureVisible()
— прокручивает область таким образом, чтобы указанный прямоуголь- ник находился в видимой области представления. Форматы метода: ensureVisible(
Необязательные параметры xMargin и yMargin задают минимальные значения просветов между границами графического объекта и краями представления по горизонтали и вер- тикали соответственно;
update(
— вызывает перерисовку указанной прямоугольной области. Форматы метода: update(
25.4. Графические объекты
Вместо создания собственного объекта путем наследования класса
QGraphicsItem можно воспользоваться следующими стандартными классами:
QGraphicsLineItem
— линия;
QGraphicsRectItem
— прямоугольник;
QGraphicsPolygonItem
— многоугольник;
QGraphicsEllipseItem
— эллипс;
QGraphicsPixmapItem
— изображение;
QGraphicsSimpleTextItem
— простой текст;
QGraphicsTextItem
— форматированный текст;
QGraphicsPathItem
— путь;
QGraphicsSvgItem
— SVG-графика.
25.4.1. Линия
Класс
QGraphicsLineItem описывает линию. Иерархия наследования:
QGraphicsItem — QGraphicsLineItem
Форматы конструктора класса:
<Объект> = QGraphicsLineItem([parent=None])
<Объект> = QGraphicsLineItem(
<Объект> = QGraphicsLineItem(
В параметре parent можно указать ссылку на родительский объект.
Глава 25. Графическая сцена
599
Класс
QGraphicsLineItem наследует все методы класса
QGraphicsItem и включает поддержку следующих методов (полный их список можно найти на странице https://doc.qt.io/qt-5/ qgraphicslineitem.html
):
setLine()
— задает параметры линии. Форматы метода: setLine(
line()
— возвращает параметры линии в виде экземпляра класса
QLineF
;
setPen(
— устанавливает перо.
25.4.2. Класс QAbstractGraphicsShapeItem
Класс
QAbstractGraphicsShapeItem является базовым классом всех графических фигур, более сложных, чем линия. Иерархия наследования:
QGraphicsItem — QAbstractGraphicsShapeItem
Класс
QAbstractGraphicsShapeItem поддерживает следующие методы (здесь приведены только основные — полный их список можно найти на странице https://doc.qt.io/qt-5/ qabstractgraphicsshapeitem.html
):
setPen(
— устанавливает перо;
setBrush(
— устанавливает кисть.
25.4.3. Прямоугольник
Класс
QGraphicsRectItem описывает прямоугольник. Иерархия наследования:
QGraphicsItem — QAbstractGraphicsShapeItem — QGraphicsRectItem
Форматы конструктора класса:
<Объект> = QGraphicsRectItem([parent=None])
<Объект> = QGraphicsRectItem(
<Объект> = QGraphicsRectItem(
В параметре parent можно указать ссылку на родительский объект.
Класс
QGraphicsRectItem наследует все методы базовых классов и поддерживает следую- щие методы (здесь приведены только основные — полный их список можно найти на стра- нице https://doc.qt.io/qt-5/qgraphicsrectitem.html):
setRect()
— задает параметры прямоугольника. Форматы метода: setRect(
rect()
— возвращает параметры прямоугольника в виде экземпляра класса
QRectF
25.4.4. Многоугольник
Класс
QGraphicsPolygonItem описывает многоугольник. Иерархия наследования:
QGraphicsItem — QAbstractGraphicsShapeItem — QGraphicsPolygonItem
600
Часть II. Библиотека PyQt 5
Форматы конструктора класса:
<Объект> = QGraphicsPolygonItem([parent=None])
<Объект> = QGraphicsPolygonItem(
В параметре parent можно указать ссылку на родительский объект.
Класс
QGraphicsPolygonItem наследует все методы из базовых классов и поддерживает сле- дующие методы (здесь приведены только основные — полный их список можно найти на странице https://doc.qt.io/qt-5/qgraphicspolygonitem.html):
setPolygon(
— задает параметры многоугольника;
polygon()
— возвращает параметры многоугольника в виде экземпляра класса
QPolygonF
25.4.5. Эллипс
Класс
QGraphicsEllipseItem описывает эллипс. Иерархия наследования:
QGraphicsItem — QAbstractGraphicsShapeItem — QGraphicsEllipseItem
Форматы конструктора класса:
<Объект> = QGraphicsEllipseItem([parent=None])
<Объект> = QGraphicsEllipseItem(
<Объект> = QGraphicsEllipseItem(
В параметре parent можно указать ссылку на родительский объект.
Класс
QGraphicsEllipseItem наследует все методы базовых классов и поддерживает сле- дующие методы (здесь приведены только основные — полный их список можно найти на странице https://doc.qt.io/qt-5/qgraphicsellipseitem.html):
setRect()
— задает параметры прямоугольника, в который необходимо вписать эллипс.
Форматы метода: setRect(
rect()
— возвращает параметры прямоугольника, в который вписан эллипс, в виде экземпляра класса
QRectF
;
setStartAngle(<Угол>)
и setSpanAngle(<Угол>)
— задают начальный и конечный углы сектора соответственно. Следует учитывать, что значения углов задаются в значени- ях
1
/
16
°. Полный круг эквивалентен значению 16 × 360 = 5760. Нулевой угол находится в позиции «трех часов». Положительные значения углов отсчитываются против часовой стрелки, а отрицательные — по часовой стрелке;
startAngle()
и spanAngle()
— возвращают значения начального и конечного углов сек- тора соответственно.
25.4.6. Изображение
Класс
QGraphicsPixmapItem описывает изображение. Иерархия наследования:
QGraphicsItem — QGraphicsPixmapItem
Глава 25. Графическая сцена
601
Форматы конструктора класса:
<Объект> = QGraphicsPixmapItem([parent=None])
<Объект> = QGraphicsPixmapItem(
В параметре parent можно указать ссылку на родительский объект.
Класс
QGraphicsPixmapItem наследует все методы из класса
QGraphicsItem и поддерживает следующие методы (здесь приведены только основные — полный их список можно найти на странице https://doc.qt.io/qt-5/qgraphicspixmapitem.html):
setPixmap(
— задает изображение;
pixmap()
— возвращает представляющий изображение экземпляр класса
QPixmap
;
setOffset()
— задает местоположение изображения. Форматы метода: setOffset(
offset()
— возвращает местоположение изображения в виде экземпляра класса
QPointF
;
setShapeMode(<Режим>)
— задает режим определения формы изображения. В качестве параметра могут быть указаны следующие атрибуты класса
QGraphicsPixmapItem
:
•
MaskShape
—
0
— используется результат выполнения метода mask()
класса
QPixmap
(значение по умолчанию);
•
BoundingRectShape
—
1
— форма определяется по контуру изображения;
•
HeuristicMaskShape
—
2
— используется результат выполнения метода createHeuristicMask()
класса
QPixmap
;
setTransformationMode(<Режим>)
— задает режим сглаживания. В качестве параметра могут быть указаны следующие атрибуты класса
QtCore.Qt
:
•
FastTransformation
—
0
— сглаживание выключено (по умолчанию);
•
SmoothTransformation
—
1
— сглаживание включено.
25.4.7. Простой текст
Класс
QGraphicsSimpleTextItem описывает простой текст. Иерархия наследования:
QGraphicsItem — QAbstractGraphicsShapeItem — QGraphicsSimpleTextItem
Форматы конструктора класса:
<Объект> = QGraphicsSimpleTextItem([parent=None])
<Объект> = QGraphicsSimpleTextItem(<Текст>[, parent=None])
В параметре parent можно указать ссылку на родительский объект.
Класс
QGraphicsSimpleTextItem наследует все методы из базовых классов и поддерживает следующие методы (здесь приведены только основные — полный их список можно найти на странице https://doc.qt.io/qt-5/qgraphicssimpletextitem.html):
setText(<Текст>)
— задает текст;
text()
— возвращает текст;
setFont(
— задает шрифт;
font()
— возвращает описывающий заданный шрифт экземпляр класса
QFont
602
Часть II. Библиотека PyQt 5 25.4.8. Форматированный текст
Класс
QGraphicsTextItem описывает форматированный текст. Иерархия наследования:
(QObject, QGraphicsItem) — QGraphicsObject — QGraphicsTextItem
Форматы конструктора класса:
<Объект> = QGraphicsTextItem([parent=None])
<Объект> = QGraphicsTextItem(<Текст>[, parent=None])
В параметре parent можно указать ссылку на родительский объект.
Класс
QGraphicsTextItem наследует все методы из базовых классов и поддерживает сле- дующие методы (здесь приведены только основные — полный их список можно найти на странице https://doc.qt.io/qt-5/qgraphicstextitem.html):
setPlainText(<Простой текст>)
— задает простой текст;
toPlainText()
— возвращает простой текст;
setHtml(
1 ... 51 52 53 54 55 56 57 58 ... 83
— задает форматированный текст в виде HTML-кода;
toHtml()
— возвращает форматированный текст в виде HTML-кода;
setFont(
— устанавливает шрифт;
font()
— возвращает описывающий установленный шрифт экземпляр класса
QFont
;
setDefaultTextColor(
— задает цвет текста по умолчанию;
defaultTextColor()
— возвращает цвет текста по умолчанию;
setTextWidth(<Ширина>)
— задает предпочитаемую ширину строки. Если текст не поме- щается в установленную ширину, он будет перенесен на новую строку;
textWidth()
— возвращает предпочитаемую ширину текста;
setDocument(
— задает объект документа в виде экземпляра класса
QTextDocument
(см. разд. 21.6.4);
document()
— возвращает ссылку на объект документа (экземпляр класса
QTextDocument
; см. разд. 21.6.4);
setTextCursor(
— устанавливает объект курсора в виде экземпляра клас- са
QTextCursor
(см. разд. 21.6.5);
textCursor()
— возвращает объект курсора (экземпляр класса
QtextCursor
— см. разд. 21.6.5);
setTextInteractionFlags(<Режим>)
— задает режим взаимодействия пользователя с тек- стом. По умолчанию используется режим
NoTextInteraction
, при котором пользователь не может взаимодействовать с текстом. Допустимые режимы приведены в разд. 21.1
(см. описание метода setTextInteractionFlags()
);
setTabChangesFocus(<Флаг>)
— если в качестве параметра указано значение
False
, то нажатием клавиши
True
, клавиша
setOpenExternalLinks(<Флаг>)
— если в качестве параметра указано значение
True
, щелчок на гиперссылке приведет к открытию браузера, используемого в системе по умолчанию, и загрузке страницы с указанным в гиперссылке URL-адресом. Метод рабо- тает только при использовании режима
TextBrowserInteraction
Глава 25. Графическая сцена
603
Класс
QGraphicsTextItem поддерживает следующие сигналы:
linkActivated(
— генерируется при переходе по гиперссылке. Через параметр внутри обработчика доступен URL-адрес гиперссылки в виде строки;
linkHovered(
— генерируется при наведении указателя мыши на гиперссылку.
Через параметр внутри обработчика доступен URL-адрес гиперссылки в виде строки.
25.5. Группировка объектов
Объединить несколько объектов в группу позволяет класс
QGraphicsItemGroup
. Над сгруп- пированными объектами можно выполнять различные преобразования, например пере- мещать или поворачивать их одновременно. Иерархия наследования для класса
QGraphicsItemGroup выглядит так:
QGraphicsItem — QGraphicsItemGroup
Формат конструктора класса:
<Объект> = QGraphicsItemGroup([parent=None])
В параметре parent можно указать ссылку на родительский объект.
Класс
QGraphicsItemGroup наследует все методы класса
QGraphicsItem и поддерживает сле- дующие методы (здесь приведены только основные — полный их список можно найти на странице https://doc.qt.io/qt-5/qgraphicsitemgroup.html):
addToGroup(
— добавляет объект в группу;
removeFromGroup(
— удаляет объект из группы.
Создать группу и добавить ее на сцену можно и с помощью метода createItemGroup(
<Список с объектами>)
класса
QGraphicsScene
. Метод возвращает ссылку на группу (экзем- пляр класса
QGraphicsItemGroup
). Удалить группу со сцены позволяет метод destroyItemGroup(
класса
QGraphicsScene
Добавить объект в группу позволяет также метод setGroup(
класса
QGraphicsItem
. Получить ссылку на группу, в которой находится объект, можно вызовом метода group()
класса
QGraphicsItem
. Если объект не находится ни в какой группе, метод возвращает
None
25.6. Эффекты
К графическим объектам можно применить различные эффекты, например изменение про- зрачности или цвета, отображение тени или размытие. Наследуя класс
QGraphicsEffect и переопределяя в нем метод draw()
, можно создать свой эффект.
Для установки эффекта и получения ссылки на него предназначены следующие методы класса
QGraphicsItem
:
setGraphicsEffect(
— задает эффект;
graphicsEffect()
— возвращает ссылку на эффект или значение
None
, если эффект не был установлен.
604
Часть II. Библиотека PyQt 5 25.6.1. Класс QGraphicsEffect
Класс
QGraphicsEffect является базовым классом для всех эффектов. Иерархия наследова- ния выглядит так:
QObject — QGraphicsEffect
Формат конструктора класса:
QGraphicsEffect([parent=None])
Класс
QGraphicsEffect поддерживает следующие основные методы (полный их список можно найти на странице https://doc.qt.io/qt-5/qgraphicseffect.html):
draw(self,
— собственно рисует эффект. Этот абстрактный метод должен быть переопределен в производных классах;
setEnabled(<Флаг>)
— если в качестве параметра указано значение
False
, эффект от- ключается. Значение
True разрешает использование эффекта. Метод является слотом;
isEnabled()
— возвращает значение
True
, если эффект включен, и
False
— в противном случае;
update()
— вызывает перерисовку эффекта. Метод является слотом.
Класс
QGraphicsEffect поддерживает сигнал enabledChanged(<Флаг>)
, который генерирует- ся при изменении статуса эффекта. Внутри обработчика через параметр доступно значение
True
, если эффект включен, и
False
— в противном случае.
25.6.2. Тень
Класс
QGraphicsDropShadowEffect реализует вывод тени у объекта. Иерархия наследования:
QObject — QGraphicsEffect — QGraphicsDropShadowEffect
Формат конструктора класса:
<Объект> = QGraphicsDropShadowEffect([parent=None])
Класс
QGraphicsDropShadowEffect наследует все методы базовых классов и поддерживает следующие методы (здесь приведены только основные — полный их список можно найти на странице https://doc.qt.io/qt-5/qgraphicsdropshadoweffect.html):
setColor(
— задает цвет тени. По умолчанию используется полупрозрачный темно-серый цвет (
QColor(63, 63, 63, 180)
). Метод является слотом;
color()
— возвращает цвет тени (экземпляр класса
QColor
);
setBlurRadius(<Значение>)
— задает радиус размытия тени в виде вещественного числа.
Метод является слотом;
blurRadius()
— возвращает радиус размытия тени;
setOffset()
— задает смещение тени. Форматы метода: setOffset(<По оси X>, <По оси Y>) setOffset(<Смещение по обеим осям>) setOffset(
Второй конструктор задает смещение сразу по обеим осям координат. В первом и втором конструкторах параметры задаются вещественными числами. Метод является слотом;
Глава 25. Графическая сцена
605
offset()
— возвращает смещение тени в виде экземпляра класса
QPointF
;
setXOffset(<Смещение>)
— задает смещение по оси
X
в виде вещественного числа. Метод является слотом;
xOffset()
— возвращает смещение по оси
X
;
setYOffset(<Смещение>)
— задает смещение по оси
Y
в виде вещественного числа. Метод является слотом;
yOffset()
— возвращает смещение по оси
Y
Класс
QGraphicsDropShadowEffect поддерживает сигналы:
colorChanged(
— генерируется при изменении цвета тени. Внутри обработчика через параметр доступен новый цвет;
blurRadiusChanged(<Радиус размытия>)
— генерируется при изменении радиуса размы- тия. Внутри обработчика через параметр доступно новое значение в виде вещественного числа;
offsetChanged(
— генерируется при изменении смещения. Внутри обработ- чика через параметр доступно новое значение.
25.6.3. Размытие
Класс
QGraphicsBlurEffect реализует эффект размытия. Иерархия наследования:
QObject — QGraphicsEffect — QGraphicsBlurEffect
Формат конструктора класса:
<Объект> = QGraphicsBlurEffect([parent=None])
Класс
QGraphicsBlurEffect наследует все методы из базовых классов и поддерживает сле- дующие методы (здесь приведены только основные — полный их список можно найти на странице https://doc.qt.io/qt-5/qgraphicsblureffect.html):
setBlurRadius(<Значение>)
— задает радиус размытия в виде вещественного числа. Ме- тод является слотом;
blurRadius()
— возвращает радиус размытия.
Класс
QGraphicsBlurEffect поддерживает сигнал blurRadiusChanged(<Радиус размытия>)
, который генерируется при изменении радиуса размытия. Внутри обработчика через пара- метр доступно новое значение в виде вещественного числа.
25.6.4. Изменение цвета
Класс
QGraphicsColorizeEffect реализует эффект изменения цвета. Иерархия наследования:
QObject — QGraphicsEffect — QGraphicsColorizeEffect
Формат конструктора класса:
<Объект> = QGraphicsColorizeEffect([parent=None])
Класс
QGraphicsColorizeEffect наследует все методы из базовых классов и поддерживает следующие методы (здесь приведены только основные — полный их список можно найти на странице https://doc.qt.io/qt-5/qgraphicscolorizeeffect.html):
setColor(
— задает цвет. По умолчанию используется светло-синий цвет
(
QColor(0, 0, 192, 255)
). Метод является слотом;
606
Часть II. Библиотека PyQt 5
color()
— возвращает текущий цвет в виде экземпляра класса
QColor
;
setStrength(<Значение>)
— задает интенсивность цвета. В качестве значения указыва- ется вещественное число от
0.0
до
1.0
(значение по умолчанию). Метод является сло- том;
strength()
— возвращает интенсивность цвета.
Класс
QGraphicsColorizeEffect поддерживает сигналы:
colorChanged(
— генерируется при изменении цвета. Внутри обработчика через параметр доступен новый цвет;
strengthChanged(<Интенсивность>)
— генерируется при изменении интенсивности цве- та. Внутри обработчика через параметр доступно новое значение в виде вещественного числа.
25.6.5. Изменение прозрачности
Класс
QGraphicsOpacityEffect реализует эффект прозрачности. Иерархия наследования:
QObject — QGraphicsEffect — QGraphicsOpacityEffect
Формат конструктора класса:
<Объект> = QGraphicsOpacityEffect([parent=None])
Класс
QGraphicsOpacityEffect наследует все методы базовых классов и поддерживает сле- дующие методы (здесь приведены только самые полезные — полный их список можно най- ти на странице https://doc.qt.io/qt-5/qgraphicsopacityeffect.html):
setOpacity(<Значение>)
— задает степень прозрачности. В качестве значения указыва- ется вещественное число от
0.0
до
1.0
. По умолчанию используется значение
0.7
. Метод является слотом;
opacity()
— возвращает степень прозрачности;
setOpacityMask(
— задает маску. Метод является слотом;
opacityMask()
— возвращает маску в виде экземпляра класса
QBrush
Класс
QGraphicsOpacityEffect поддерживает следующие сигналы:
opacityChanged(<Прозрачность>)
— генерируется при изменении степени прозрачности.
Внутри обработчика через параметр доступно новое значение в виде вещественного числа;
opacityMaskChanged(
— генерируется при изменении маски. Через параметр доступна новая маска.
25.7. Обработка событий
Все происходящие в графических объектах события изначально возникают в компоненте- представлении. Компонент-представление преобразует их и передает объекту сцены, кото- рый, в свою очередь, перенаправляет их объекту, способному обработать возникшее собы- тие (так, щелчок мыши передается объекту, который расположен по координатам щелчка).
Обработка событий в представлении ничем не отличается от обычной обработки событий, рассмотренной в главе 19. Однако обработка событий в графическом объекте имеет свои особенности, которые мы и рассмотрим в этом разделе.
Глава 25. Графическая сцена
607 25.7.1. События клавиатуры
При обработке событий клавиатуры следует учитывать, что:
графический объект должен иметь возможность принимать фокус ввода. Для этого не- обходимо установить флаг
ItemIsFocusable
, например, с помощью метода setFlag()
класса
QGraphicsItem
;
объект должен быть в фокусе ввода. Методы, позволяющие управлять фокусом ввода, мы рассматривали в разд. 25.1.5 и 25.3.1;
чтобы захватить эксклюзивный ввод с клавиатуры, следует вызвать у графического объекта метод grabKeyboard()
, а чтобы освободить ввод — метод ungrabKeyboard()
;
можно перехватить нажатие любых клавиш, кроме
если событие обработано, нужно вызвать метод accept()
у объекта события, в против- ном случае — метод ignore()
Для обработки событий клавиатуры следует наследовать класс, реализующий графический объект, и переопределить в нем методы:
focusInEvent(self,
— вызывается при получении фокуса ввода. Через пара- метр
доступен экземпляр класса
QFocusEvent
(см. разд. 19.8.1);
focusOutEvent(self,
— вызывается при потере фокуса ввода. Через параметр
доступен экземпляр класса
QFocusEvent
(см. разд. 19.8.1);
keyPressEvent(self,
— вызывается при нажатии клавиши на клавиатуре. Если клавишу удерживать нажатой, метод будет вызываться постоянно, пока ее не отпустят.
Через параметр
доступен экземпляр класса
QKeyEvent
(см. разд. 19.8.3);
keyReleaseEvent(self,
— вызывается при отпускании нажатой ранее клавиши.
Через параметр
доступен экземпляр класса
QKeyEvent
(см. разд. 19.8.3).
С помощью метода setFocusProxy(
класса
QGraphicsItem можно указать объект, который будет обрабатывать события клавиатуры вместо текущего объекта. Полу- чить ссылку на назначенный ранее объект-обработчик событий клавиатуры позволяет метод focusProxy()
25.7.2. События мыши
Для обработки нажатия кнопки мыши и перемещения мыши следует наследовать класс, реализующий графический объект, и переопределить в нем такие методы:
mousePressEvent(self,
— вызывается при нажатии кнопки мыши над объек- том. Через параметр
доступен экземпляр класса
QGraphicsSceneMouseEvent
. Если событие принято, необходимо вызвать метод accept()
объекта события, в противном случае — метод ignore()
. Если был вызван метод ignore()
, методы mouseReleaseEvent()
и mouseMoveEvent()
выполнены не будут.
С помощью метода setAcceptedMouseButtons(<Кнопки>)
класса
QGraphicsItem можно указать кнопки, события от которых объект будет принимать. По умолчанию объект принимает события от всех кнопок мыши. Если в параметре
<Кнопки>
указать атрибут
NoButton класса
QtCore.Qt
, объект вообще не станет принимать события от кнопок мыши;
mouseReleaseEvent(self,
— вызывается при отпускании ранее нажатой кнопки мыши. Через параметр
доступен экземпляр класса
QGraphicsSceneMouseEvent
;
608
Часть II. Библиотека PyQt 5
mouseDoubleClickEvent(self,
— вызывается при двойном щелчке мышью в области объекта. Через параметр
доступен экземпляр класса
QgraphicsScene-
MouseEvent
;
mouseMoveEvent(self,
— вызывается при перемещении мыши. Через параметр
доступен экземпляр класса
QGraphicsSceneMouseEvent
Класс
QGraphicsSceneMouseEvent наследует все методы классов
QGraphicsSceneEvent и
QEvent и добавляет поддержку следующих методов:
pos()
— возвращает экземпляр класса
QPointF
с координатами указателя мыши в преде- лах области объекта;
scenePos()
— возвращает экземпляр класса
QPointF
с координатами указателя мыши в пределах сцены;
screenPos()
— возвращает экземпляр класса
QPoint с координатами указателя мыши в пределах экрана;
lastPos()
— возвращает экземпляр класса
QPointF
с координатами последней запом- ненной представлением позиции мыши в пределах области объекта;
lastScenePos()
— возвращает экземпляр класса
QPointF
с координатами последней запомненной представлением позиции мыши в пределах сцены;
lastScreenPos()
— возвращает экземпляр класса
QPoint с координатами последней запомненной представлением позиции мыши в пределах экрана;
buttonDownPos(<Кнопка>)
— возвращает экземпляр класса
QPointF
с координатами щелчка указанной кнопки мыши в пределах области объекта;
buttonDownScenePos(<Кнопка>)
— возвращает экземпляр класса
QPointF
с координатами щелчка указанной кнопки мыши в пределах сцены;
buttonDownScreenPos(<Кнопка>)
— возвращает экземпляр класса
QPoint с координатами щелчка указанной кнопки мыши в пределах экрана;
button()
— возвращает обозначение кнопки мыши, нажатие которой вызвало событие;
buttons()
— возвращает комбинацию обозначений всех кнопок мыши, одновременное нажатие которых вызвало событие;
modifiers()
— возвращает комбинацию обозначений всех клавиш-модификаторов
(
По умолчанию событие мыши перехватывает объект, на котором был произведен щелчок мышью. Чтобы перехватывать нажатие и отпускание мыши вне объекта, следует захватить мышь с помощью метода grabMouse()
класса
QGraphicsItem
. Освободить захваченную ранее мышь позволяет метод ungrabMouse()
. Получить ссылку на объект, захвативший мышь, можно с помощью метода mouseGrabberItem()
класса
QGraphicsScene
Для обработки прочих событий мыши нужно наследовать класс, реализующий графический объект, и переопределить следующие методы:
hoverEnterEvent(self,
— вызывается при наведении указателя мыши на область объекта. Через параметр
доступен экземпляр класса
1 ... 52 53 54 55 56 57 58 59 ... 83
QGraphicsSceneHoverEvent
;
hoverLeaveEvent(self,
— вызывается, когда указатель мыши покидает область объекта. Через параметр
доступен экземпляр класса
QGraphicsSceneHoverEvent
;
Глава 25. Графическая сцена
609
hoverMoveEvent(self,
— вызывается при перемещении указателя мыши внут- ри области объекта. Через параметр
доступен экземпляр класса
QGraphicsSceneHoverEvent
;
wheelEvent(self,
— вызывается при повороте колесика мыши при нахожде- нии указателя мыши над объектом. Чтобы обрабатывать событие, в любом случае следу- ет захватить мышь. Через параметр
доступен экземпляр класса
QGraphicsSceneWheelEvent
Следует учитывать, что методы hoverEnterEvent()
, hoverLeaveEvent()
и hoverMoveEvent()
будут вызваны только в том случае, если обработка этих событий разрешена. Чтобы раз- решить обработку событий перемещения мыши, следует вызвать метод setAcceptHoverEvents(<Флаг>)
класса
QGraphicsItem и передать ему значение
True
. Значе- ние
False запрещает обработку событий перемещения указателя. Получить текущее состоя- ние позволяет метод acceptHoverEvents()
Класс
QGraphicsSceneHoverEvent наследует все методы классов
QGraphicsSceneEvent и
QEvent и добавляет поддержку своих методов:
pos()
— возвращает экземпляр класса
QPointF
с координатами указателя мыши в преде- лах области объекта;
scenePos()
— возвращает экземпляр класса
QPointF
с координатами указателя мыши в пределах сцены;
screenPos()
— возвращает экземпляр класса
QPoint с координатами указателя мыши в пределах экрана;
lastPos()
— возвращает экземпляр класса
QPointF
с координатами последней запом- ненной представлением позиции мыши в пределах области объекта;
lastScenePos()
— возвращает экземпляр класса
QPointF
с координатами последней запомненной представлением позиции мыши в пределах сцены;
lastScreenPos()
— возвращает экземпляр класса
QPoint с координатами последней запомненной представлением позиции мыши в пределах экрана;
modifiers()
— возвращает комбинацию обозначений всех клавиш-модификаторов
(
Класс
QGraphicsSceneWheelEvent наследует все методы из классов
QGraphicsSceneEvent и
QEvent и добавляет поддержку следующих методов:
delta()
— возвращает расстояние поворота колесика, измеряемое в
1
/
8
°. Положительное значение означает, что колесико поворачивалось в направлении от пользователя, отри- цательное — к пользователю;
orientation()
— возвращает направление вращения колесика в виде значения одного из следующих атрибутов класса
QtCore.Qt
:
•
Horizontal
—
1
— по горизонтали;
•
Vertical
—
2
— по вертикали;
pos()
— возвращает экземпляр класса
QPointF
с координатами указателя мыши в преде- лах области объекта;
scenePos()
— возвращает экземпляр класса
QPointF
с координатами указателя мыши в пределах сцены;
610
Часть II. Библиотека PyQt 5
screenPos()
— возвращает экземпляр класса
QPoint с координатами указателя мыши в пределах экрана;
buttons()
— возвращает комбинацию обозначений всех кнопок мыши, нажатых одно- временно с вращением колесика;
modifiers()
— возвращает комбинацию обозначений всех клавиш-модификаторов
(
25.7.3. Обработка перетаскивания и сброса
Прежде чем обрабатывать перетаскивание и сброс, необходимо сообщить системе, что гра- фический объект может их обработать. Для этого следует вызвать метод setAcceptDrops()
класса
QGraphicsItem и передать ему значение
True
Обработка перетаскивания и сброса в графическом объекте выполняется следующим об- разом:
внутри метода dragEnterEvent()
проверяется MIME-тип перетаскиваемых данных и действие. Если графический объект способен обработать сброс этих данных и соглаша- ется с предложенным действием, необходимо вызвать метод acceptProposedAction()
объекта события. Если нужно изменить действие, методу setDropAction()
объекта собы- тия передается новое действие, а затем у того же объекта вызывается метод accept()
вместо метода acceptProposedAction()
;
если необходимо ограничить область сброса некоторым участком графического объекта, можно дополнительно определить в нем метод dragMoveEvent()
. Этот метод будет по- стоянно вызываться при перетаскивании внутри области графического объекта. При со- гласии со сбрасыванием следует вызвать у объекта события метод accept()
;
внутри метода dropEvent()
производится обработка сброса.
Обработать события, возникающие при перетаскивании и сбрасывании объектов, позволя- ют следующие методы:
dragEnterEvent(self,
— вызывается, когда перетаскиваемый объект входит в область графического объекта. Через параметр
доступен экземпляр класса
QGraphicsSceneDragDropEvent
;
dragLeaveEvent(self,
— вызывается, когда перетаскиваемый объект покидает область графического объекта. Через параметр
доступен экземпляр класса
QGraphicsSceneDragDropEvent
;
dragMoveEvent(self,
— вызывается при перетаскивании объекта внутри об- ласти графического объекта. Через параметр
доступен экземпляр класса
QGraphicsSceneDragDropEvent
;
dropEvent(self,
— вызывается при сбрасывании объекта в области гра- фического объекта. Через параметр
доступен экземпляр класса
QGraphicsSceneDragDropEvent
Класс
QGraphicsSceneDragDropEvent наследует все методы классов
QGraphicsSceneEvent и
QEvent и добавляет поддержку методов:
mimeData()
— возвращает экземпляр класса
QMimeData с перемещаемыми данными и ин- формацией о MIME-типе;
Глава 25. Графическая сцена
611
pos()
— возвращает экземпляр класса
QPointF
с координатами указателя мыши в преде- лах области объекта;
scenePos()
— возвращает экземпляр класса
QPointF
с координатами указателя мыши в пределах сцены;
screenPos()
— возвращает экземпляр класса
QPoint с координатами указателя мыши в пределах экрана;
possibleActions()
— возвращает комбинацию возможных действий при сбрасывании;
proposedAction()
— возвращает действие по умолчанию при сбрасывании;
acceptProposedAction()
— подтверждает готовность принять перемещаемые данные и согласие с действием по умолчанию, возвращаемым методом proposedAction()
;
setDropAction(<Действие>)
— указывает другое действие при сбрасывании. После изме- нения действия следует вызвать метод accept()
, а не acceptProposedAction()
;
dropAction()
— возвращает действие, которое должно быть выполнено при сбрасы- вании;
buttons()
— возвращает комбинацию обозначений всех кнопок мыши, нажатых в про- цессе перетаскивания;
modifiers()
— возвращает комбинацию обозначений всех клавиш-модификаторов
(
source()
— возвращает ссылку на источник события или значение
None
25.7.4. Фильтрация событий
События можно перехватывать еще до того, как они будут переданы специализированному методу. Для этого в классе графического объекта необходимо переопределить метод sceneEvent(self,
. Через параметр
здесь будет доступен объект с допол- нительной информацией о событии. Тип этого объекта различен для разных типов событий.
Внутри метода следует вернуть значение
True
, если событие обработано, и
False
— в про- тивном случае. Если вернуть значение
True
, специализированный метод (например, mousePressEvent()
) выполняться не будет.
Чтобы произвести фильтрацию событий какого-либо объекта, в классе графического объек- та необходимо переопределить метод sceneEventFilter(self,
Через параметр
здесь будет доступна ссылка на объект, в котором возник- ло событие, а через параметр
— объект с информацией о самом событии. Тип этого объекта различен для разных типов событий. Внутри метода следует вернуть значение
True
, если событие обработано, и
False
— в противном случае. Если вернуть значение
True
, объект, в котором возникло событие, не получит его.
Указать, события какого объекта фильтруются, позволяют следующие методы класса
QGraphicsItem
:
installSceneEventFilter(
— задает объект, который будет произво- дить фильтрацию событий текущего объекта;
removeSceneEventFilter(
— удаляет объект-фильтр событий;
setFiltersChildEvents(<Флаг>)
— если в качестве параметра указано значение
True
, текущий объект будет производить фильтрацию событий всех своих дочерних объектов.
612
Часть II. Библиотека PyQt 5 25.7.5. Обработка изменения состояния объекта
Чтобы обработать изменение состояния объекта, следует переопределить метод itemChange(self, <Состояние>, <Значение>)
в классе графического объекта. Метод должен возвращать новое значение. Через параметр
<Состояние>
доступно состояние, которое было изменено, в виде значения одного из следующих атрибутов класса
QGraphicsItem
(здесь перечислены только основные
— полный их список можно найти на странице https://doc.qt.io/qt-5/qgraphicsitem.html#GraphicsItemChange-enum
):
ItemEnabledChange
—
3
— изменилось состояние доступности;
ItemEnabledHasChanged
—
13
— изменилось состояние доступности. Возвращаемое зна- чение игнорируется;
ItemPositionChange
—
0
— изменилась позиция объекта. Метод будет вызван, только если установлен флаг
ItemSendsGeometryChanges
;
ItemPositionHasChanged
—
9
— изменилась позиция объекта. Метод будет вызван, толь- ко если установлен флаг
ItemSendsGeometryChanges
. Возвращаемое значение игнориру- ется;
ItemScenePositionHasChanged
—
27
— изменилась позиция объекта на сцене с учетом преобразований, примененных к самому объекту и его родителям. Метод будет вызван, только если установлен флаг
ItemSendsScenePositionChanges
. Возвращаемое значение игнорируется;
ItemTransformChange
—
8
— изменилась матрица преобразований. Метод будет вызван, только если установлен флаг
ItemSendsGeometryChanges
;
ItemTransformHasChanged
—
10
— изменилась матрица преобразований. Метод будет вызван, только если установлен флаг
ItemSendsGeometryChanges
. Возвращаемое значение игнорируется;
ItemSelectedChange
—
4
— изменилось выделение объекта;
ItemSelectedHasChanged
—
14
— изменилось выделение объекта. Возвращаемое значе- ние игнорируется;
ItemVisibleChange
—
2
— изменилось состояние видимости объекта;
ItemVisibleHasChanged
—
12
— изменилось состояние видимости объекта. Возвращае- мое значение игнорируется;
ItemCursorChange
—
17
— изменился курсор;
ItemCursorHasChanged
—
18
— изменился курсор. Возвращаемое значение игнорируется;
ItemToolTipChange
—
19
— изменилась всплывающая подсказка;
ItemToolTipHasChanged
—
20
— изменилась всплывающая подсказка. Возвращаемое значение игнорируется;
ItemFlagsChange
—
21
— изменились флаги;
ItemFlagsHaveChanged
—
22
— изменились флаги. Возвращаемое значение игнорируется;
ItemZValueChange
—
23
— изменилось положение по оси
Z
;
ItemZValueHasChanged
—
24
— изменилось положение по оси
Z
. Возвращаемое значение игнорируется;
ItemOpacityChange
—
25
— изменилась прозрачность объекта;
Глава 25. Графическая сцена
613
ItemOpacityHasChanged
—
26
— изменилась прозрачность объекта. Возвращаемое значе- ние игнорируется;
ItemParentChange
—
5
— изменился родитель объекта;
ItemParentHasChanged
—
15
— изменился родитель объекта. Возвращаемое значение игнорируется;
ItemChildAddedChange
—
6
— в объект был добавлен потомок;
ItemChildRemovedChange
—
7
— из объекта был удален потомок;
ItemSceneChange
—
11
— объект был перемещен на другую сцену;
ItemSceneHasChanged
—
16
— объект был перемещен на другую сцену. Возвращаемое значение игнорируется.
В
НИМАНИЕ
!
Вызов некоторых методов из метода itemChange() может привести к рекурсии. За подроб- ной информацией обращайтесь к документации по классу QGraphicsItem.
П
РИМЕЧАНИЕ
PyQt 5 также поддерживает помещение на сцену видеозаписей в качестве отдельных гра- фических объектов и создание анимации. За подробным описанием обращайтесь к доку- ментации по этой библиотеке.
ГЛ А В А
26
Диалоговые окна
Диалоговые окна предназначены для информирования пользователя и получения от него требуемых данных. В большинстве случаев окна подобного рода являются модальными
(т. е. блокирующими все окна приложения или только родительское окно) и отображаются на непродолжительный промежуток времени. Для работы с диалоговыми окнами в PyQt предназначен класс
QDialog
, который предоставляет множество специальных методов, по- зволяющих дождаться закрытия окна, определить статус его завершения и выполнить про- чие задачи. Класс
QDialog наследуют другие классы, которые реализуют готовые диалого- вые окна. Например, класс
QMessageBox предоставляет диалоговые окна для вывода сообще- ний, класс
QInputDialog
— для ввода данных, класс
QFileDialog
— для выбора каталога или файла и т. д.
Все рассмотренные в этой главе классы определены в модуле
QtWidgets
, если не указано иное.
26.1. Пользовательские диалоговые окна
Класс
QDialog реализует диалоговое окно. По умолчанию окно выводится с рамкой и заго- ловком, в котором расположены кнопки Справка и Закрыть. Размеры окна можно изме- нять с помощью мыши. Иерархия наследования для класса
QDialog выглядит так:
(QObject, QPaintDevice) — QWidget — QDialog
Конструктор класса
QDialog имеет следующий формат:
<Объект> = QDialog([parent=<Родитель>][, flags=<Тип окна>])
В параметре parent указывается ссылка на родительское окно. Если родитель не указан или имеет значение
None
, диалоговое окно будет центрироваться относительно экрана, если указана — относительно родительского окна (это также позволяет создать модальное диалоговое окно, которое будет блокировать только окно родителя, а не все окна прило- жения). Какие именно значения можно указать в параметре flags
, мы уже рассматривали в разд. 18.2. Тип окна по умолчанию —
Dialog
Класс
QDialog наследует все методы базовых классов и дополнительно реализует следую- щие методы (здесь приведены только основные — полный их список можно найти на стра- нице https://doc.qt.io/qt-5/qdialog.html):
exec()
— отображает модальное диалоговое окно, дожидается закрытия окна и возвра- щает код возврата в виде значения следующих атрибутов класса
QDialog
:
Глава 26. Диалоговые окна
615
•
Accepted
—
1
— нажата кнопка OK;
•
Rejected
—
0
— нажата кнопка Cancel, кнопка Закрыть в заголовке окна или кла- виша
Метод является слотом. Вместо него можно использовать метод exec_()
, предусмотрен- ный для совместимости с предыдущими версиями PyQt.
Вот пример отображения диалогового окна и обработки статуса внутри обработчика на- жатия кнопки (класс
MyDialog является наследником класса
QDialog
, а window
— ссылка на главное окно): def on_clicked(): dialog = MyDialog(window) result = dialog.exec_() if result == QtWidgets.QDialog.Accepted: print("Нажата кнопка OK")
# Здесь получаем данные из диалогового окна else: print("Нажата кнопка Cancel")
accept()
— закрывает модальное диалоговое окно и устанавливает код возврата равным значению атрибута
Accepted класса
QDialog
. Метод является слотом. Обычно его соеди- няют с сигналом нажатия кнопки OK: self.btnOK.clicked.connect(self.accept)
reject()
— закрывает модальное диалоговое окно и устанавливает код возврата равным значению атрибута
Rejected класса
QDialog
. Метод является слотом. Обычно его соеди- няют с сигналом нажатия кнопки Cancel: self.btnCancel.clicked.connect(self.reject)
done(<Код возврата>)
— закрывает модальное диалоговое окно и устанавливает код возврата равным значению параметра. Метод является слотом;
setResult(<Код возврата>)
— устанавливает код возврата;
result()
— возвращает код завершения;
setSizeGripEnabled(<Флаг>)
— если в качестве параметра указано значение
True
, то в правом нижнем углу диалогового окна будет отображен значок изменения размера, а если
False
— то скрыт (значение по умолчанию);
isSizeGripEnabled()
— возвращает значение
True
, если значок изменения размера ото- бражается в правом нижнем углу диалогового окна, и
False
— в противном случае;
setVisible(<Флаг>)
— если в параметре указано значение
True
, диалоговое окно будет отображено, а если значение
False
— то скрыто. Вместо этого метода можно пользо- ваться более удобными методами show()
и hide()
;
open()
— отображает диалоговое окно в модальном режиме, но не дожидается его за- крытия. Блокируется только родительское окно, а не все окна приложения. Метод явля- ется слотом;
setModal(<Флаг>)
— если в качестве параметра указано значение
True
, окно будет мо- дальным, а если
False
— обычным. Обратите внимание, что окно, открываемое с по- мощью метода exec()
1 ... 53 54 55 56 57 58 59 60 ... 83
, всегда будет модальным, — независимо от значения, заданного вызовом метода setModal()
. Чтобы диалоговое окно было не модальным, нужно ото- бражать его с помощью метода show()
или setVisible()
. После вызова этих методов
616
Часть II. Библиотека PyQt 5 следует вызвать методы raise_()
(чтобы поместить окно поверх всех окон) и activateWindow()
(чтобы сделать окно активным, т. е. имеющим фокус ввода).
Указать, что окно является модальным, позволяет также метод setWindowModality(<Флаг>)
класса
QWidget
. В качестве параметра могут быть указаны следующие атрибуты класса
QtCore.Qt
:
•
NonModal
—
0
— окно не является модальным;
•
WindowModal
—
1
— окно блокирует только родительские окна в пределах иерархии;
•
ApplicationModal
—
2
— окно блокирует все окна в приложении.
Окна, открытые из модального окна, не блокируются. Следует также учитывать, что метод setWindowModality()
должен быть вызван до отображения окна.
Получить текущее значение позволяет метод windowModality()
класса
QWidget
. Прове- рить, является ли окно модальным, можно с помощью метода isModal()
того же класса, который возвращает
True
, если окно является модальным, и
False
— в противном случае.
Класс
QDialog поддерживает следующие сигналы:
accepted()
— генерируется при установке флага
Accepted
(нажата кнопка OK). Не гене- рируется при закрытии окна с помощью метода hide()
или setVisible()
;
rejected()
— генерируется при установке флага
Rejected
(нажата кнопка Cancel, кноп- ка Закрыть в заголовке окна или клавиша
или setVisible()
;
finished(<Код завершения>)
— генерируется при установке кода завершения пользова- телем или вызовом методов accept()
, reject()
и done()
. Внутри обработчика через па- раметр доступен целочисленный код завершения. Сигнал не генерируется при закрытии окна с помощью метода hide()
или setVisible()
Для всех кнопок, добавляемых в диалоговое окно, автоматически вызывается метод setAutoDefault()
со значением
True в качестве параметра. В этом случае кнопка может быть нажата с помощью клавиши
С помощью метода setDefault()
можно указать кнопку по умолчанию. Эта кнопка может быть нажата с помощью клавиши
26.2. Класс QDialogButtonBox
Класс
QDialogButtonBox представляет контейнер, в который можно добавить различные кнопки: как стандартные, так и пользовательские. Внешний вид контейнера и расположение кнопок в нем зависят от используемой операционной системы. Иерархия наследования для класса
QDialogButtonBox
:
(QObject, QPaintDevice) — QWidget — QDialogButtonBox
Форматы конструктора класса
QDialogButtonBox
:
<Объект> = QDialogButtonBox([parent=None])
<Объект> = QDialogButtonBox(<Ориентация>[, parent=None])
<Объект> = QDialogButtonBox(<Стандартные кнопки>[, parent=None])
<Объект> = QDialogButtonBox(<Стандартные кнопки>, <Ориентация>[, parent=None])