ээдд. Прохоренок_Н_А__Дронов_В_А_Python_3_и_PyQt_5_Разработка_приложен. Николай Прохоренок Владимир Дронов
Скачать 7.92 Mb.
|
В первых трех форматах указываются координаты и размеры прямоугольника, в кото- рый необходимо вписать эллипс. В двух последних форматах первый параметр задает координаты центра, параметр 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 , если изображение успешно за- гружено, и |