Главная страница

ээдд. Прохоренок_Н_А__Дронов_В_А_Python_3_и_PyQt_5_Разработка_приложен. Николай Прохоренок Владимир Дронов


Скачать 7.92 Mb.
НазваниеНиколай Прохоренок Владимир Дронов
Дата05.05.2023
Размер7.92 Mb.
Формат файлаpdf
Имя файлаПрохоренок_Н_А__Дронов_В_А_Python_3_и_PyQt_5_Разработка_приложен.pdf
ТипДокументы
#1111379
страница54 из 83
1   ...   50   51   52   53   54   55   56   57   ...   83
, ) drawEllipse(, , )
В первых трех форматах указываются координаты и размеры прямоугольника, в кото- рый необходимо вписать эллипс. В двух последних форматах первый параметр задает координаты центра, параметр rX
— радиус по оси
X
, а параметр rY
— радиус по оси
Y
;
 drawArc()
— рисует дугу. Форматы метода: drawArc(, , <Ширина>, <Высота>, <Начальный угол>, <Угол>) drawArc(, <Начальный угол>, <Угол>) drawArc(, <Начальный угол>, <Угол>)
Следует учитывать, что значения углов задаются в значениях
1
/
16
°. Полный круг экви- валентен значению 5760 = 16
× 360. Нулевой угол находится в позиции «трех часов».
Положительные значения углов отсчитываются против часовой стрелки, а отрицатель- ные — по часовой стрелке;
 drawChord()
— рисует замкнутую дугу. Аналогичен методу drawArc()
, но соединяет крайние точки дуги прямой линией. Форматы метода: drawChord(, , <Ширина>, <Высота>, <Начальный угол>, <Угол>) drawChord(, <Начальный угол>, <Угол>) drawChord(, <Начальный угол>, <Угол>)
 drawPie()
— рисует замкнутый сектор. Аналогичен методу drawArc()
, но соединяет крайние точки дуги с центром окружности. Форматы метода: drawPie(, , <Ширина>, <Высота>, <Начальный угол>, <Угол>) drawPie(, <Начальный угол>, <Угол>) 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(, , <Текст>) drawText(, <Текст>) drawText(, <Текст>) drawText(, , <Ширина>, <Высота>, <Флаги>, <Текст>) drawText(, <Флаги>, <Текст>) drawText(, <Флаги>, <Текст>) drawText(, <Текст>[, option=QTextOption()])
Первые три формата метода выводят текст, начиная с указанных координат.
Следующие три формата выводят текст в указанную прямоугольную область. При этом текст, который не помещается в эту область, будет обрезан, если не указан флаг
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(, , <Ширина>, <Высота>, <Флаги>, <Текст>) boundingRect(, <Флаги>, <Текст>) boundingRect(, <Флаги>, <Текст>) boundingRect(, <Текст>[, option=QTextOption()])

Глава 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(, , ) drawPixmap(, ) drawPixmap(, ) drawPixmap(, , <Ширина>, <Высота>, ) drawPixmap(, ) drawPixmap(, , , , , <Ширина2>, <Высота2>) drawPixmap(, , ) drawPixmap(, , ) drawPixmap(, , <Ширина1>, <Высота1>, ,
, , <Ширина2>, <Высота2>) drawPixmap(, , ) 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(, ) drawImage(, ) drawImage(, ) drawImage(, ) drawImage(, , [, sx=0][, sy=0][, sw=-1][, sh=-1][, flags=AutoColor]) drawImage(, , [, flags=AutoColor]) drawImage(, , [, flags=AutoColor]) drawImage(, , [, flags=AutoColor]) drawImage(, , [, flags=AutoColor])
Первые два формата, а также пятый формат со значениями по умолчанию задают координа- ты, по которым будет находиться левый верхний угол выводимого изображения, и экземп- ляр класса
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(, ) translate() 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(, , ) drawPicture(, ) 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([, format=None][, flags=AutoColor])
— загружает изобра- жение из экземпляра класса
QByteArray
. В первом параметре можно указать данные, имеющие тип bytes
. Метод возвращает значение
True
, если изображение успешно за- гружено, и
1   ...   50   51   52   53   54   55   56   57   ...   83


написать администратору сайта