Qt как рисовать в отдельном окне

Рисование в QT

QT — технология для разработки кросс платформенных приложений, реализуемых на языке C++. Компания Nokia выпустила отличную технологию и отличную IDE к ней, которые, на мой взгляд, являются удачным сочетанием простоты написания программ (вам достаточно знать ООП и C++) и одновременной «контролируемости» (доступны все библиотеки для их просмотра). В результате получается оптимизированное приложение, в котором подключено, только то, что необходимо. Конечно в нем нет некоторых готовых реализаций, например события получения фокуса, однако есть все для его реализации.

При изучении QT можно натолкнуться на глобальную проблему реализации графики. А если попробуете искать в Google, то можно найти форум, на котором сидят гуру, и «посылают» в тот же Google, но конечно есть исключения. Макс Шлее пишет в своей замечательной книге об этом, но это больше похоже на нервные наброски. QT Assistant — отличная вещь, но нет готового примера, чтоб просто разобраться. В общем я разобрался благодаря тому, что использовал все три источника и знание ООП. Конечно можно сказать, что при желании можно разобраться легко в этом, но я хочу чтоб человек зашел в Google, набрал «Рисование в QT» и вышел на статью, в которой будет все описано рассказано на примере.

Идеология

canvas()
void paintEvent(QPaintEvent*); //вызов метода, который собственно и будет рисовать то, что вы запрограммируете далее
bool par; /* если вы захотите рисовать по событию, например нажатие кнопки изменит значение этого параметра. А потом Вы можете сделать какое-нибудь условие на этот параметр, при выполнении которого будет что-нибудь рисоваться. */

Рисование в отдельном окне

Рисование в на отдельном табе в QtabWidget
В QtCreator добавил в MainWindow tabwidget, понаделал в нем несколько табов. Теперь мне надо в.

Рисование в отдельном Layout
Как по нажатию на кнопку нарисовать линию (допустим) в отдельном каком-то layout.

Запуск в отдельном окне
Как запустить в отдельном окне блок команд, причём написанных не в одну строку, а построчно? С.

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

Русские Блоги

Технология разработки Qt: система рисования Qt (две) QPainter подробно

Если статья является оригинальной, ее воспроизведение без разрешения запрещено.
Адрес блога исходного блоггера:https://blog.csdn.net/qq21497936
Навигация по блогам исходного блоггера:https://blog.csdn.net/qq21497936/article/details/102478062
Адрес блога этой статьи:https://blog.csdn.net/qq21497936/article/details/105506028
Уважаемые читатели, знания бесконечны, но кадров мало. Либо измените потребности, либо найдите профессионала, либо исследуйте

содержание

Колонка Qt Development: Технология разработки (щелкните портал)

Технология разработки Qt: система рисования Qt (2) подробное объяснение QPainter

Предисловие

Жирный красный, давай!

Система рисования графики Qt, эта статья в основном знакомит с типом рисования QPainter.

Рисунок: класс QPainter

Обзор

Класс QPainter выполняет низкоуровневое рисование в окнах и других устройствах рисования.

QPainter предоставляет высоко оптимизированные функции для выполнения работы, необходимой для большинства программ с графическим пользовательским интерфейсом. Он может рисовать все, от простых линий до сложных фигур, таких как круговые диаграммы и хорды. Он также может рисовать выровненный текст и пиксельные карты. Обычно он рисует «естественную» систему координат, но также может выполнять преобразования вида и мира. QPainter может работать с любым объектом, который наследует класс QPaintDevice.

Обычно QPainter используется в событии рисования окна: создание и настройка (например, установка пера или кисти) рисовальщика. Затем нарисуйте. Не забудьте уничтожить объект QPainer после рисования. Например:

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

функцияQPainter::isActive()Функция состоит в том, чтобы указать, активна ли программа рисования. художникbegin()Функция и конструктор, принимающий параметры QPaintDevice, активируются,end()Функции и деструкторы отключат его.

Вместе с классами QPaintDevice и QPaintEngine QPainter составляет основу системы рисования qt. QPainter — это класс, используемый для выполнения операций рисования. QPaintDevice представляет устройство, которое можно нарисовать с помощью QPainter. QPaintEngine предоставляет интерфейс для рисования для рисования различных типов оборудования. Если рисунок активен, функция device () возвращается и устройство рисования, на котором рисунок нарисован, а paintEngine () возвращает механизм рисования, используемый в данный момент для рисования. Подробнее см. Система рисования.

Иногда требуется покраска нестандартного оборудования. QPainer поддерживает статическую функцию для выполнения этой операции, setRedirected ().

Предупреждение: Когда paintdevice является окном, QPainter можно использовать только в функции, вызываемой paintEvent () или paintEvent ().

Установить свойства

Вы можете настроить несколько параметров в соответствии с вашими предпочтениями, чтобы QPainer рисовал:

  • font()Шрифт, используемый для рисования текста. Если рисовальщик — isActive (), вы можете использовать функции fontInfo () и fontMetrics () для получения информации о текущем установленном шрифте и его показателях.
  • brush()Определите цвет или узор, используемый для заливки формы.
  • pen()Определите цвет или пунктир, используемый для рисования линий или границ.
  • backgroundMode()Определите, есть ли background (), то есть это Qt :: OpaqueMode или Qt :: TransparentMode.
  • background()Когда это Qt :: OpaqueMode, а pen () — точечный, применима только background (). В этом случае он описывает цвет пикселей фона в пунктире.
  • brushOrigin()Определяет исходную точку тайловой кисти, обычно исходную точку фона виджета.
  • viewport()、window()、worldTransform()Он формирует систему преобразования координат художника. Дополнительные сведения см. В разделе «Преобразование координат» и в документации по системе координат.
  • hasClipping()Сообщите художнику, нужно ли редактировать. (Устройство рисования также будет сохранено). Если рисовальщик будет перехвачен, он будет сохранен в clipRegion ().
  • layoutDirection()Определяет направление макета, используемое художником при рисовании текста.
  • worldMatrixEnabled()Указывает, разрешено ли преобразование мира.
  • viewTransformEnabled()Указывает, разрешено ли преобразование просмотров.

Обратите внимание, что некоторые из этих настроек отражают настройки некоторых устройств рисования, напримерQWidget::Font()QPainter::begin()Функция (или эквивалентный конструктор QPainter) копирует эти атрибуты с устройства рисования.

Состояние QPainer можно сохранить в любое время, вызвав функцию save (), которая сохраняет все доступные настройки во внутреннем стеке (в стеке). Функция restore () состоит в том, чтобы восстановить их (вытащить их из стека).

рисовать

QPainter предоставляет функции для рисования большинства примитивов:drawPoint()、drawPoints()、drawLine()、drawRect()、drawRoundedRect()、drawEllipse()、drawArc()、drawPie()、drawChord()、drawPolyline()、drawPolygon()、drawConverExpolygon()сdrawCubicBezier()。drawRects()сdrawLines()Эти две функции используют текущее перо для рисования заданного количества прямоугольников или линий в заданном массиве QRects или QLines.

Класс QPainer также предоставляет функцию fillRect (), которая заполняет данный QRect заданным QBrush и eraseRect (), чтобы стереть область внутри данного прямоугольника.

Все эти функции имеют версии с плавающей запятой и целые числа (рекомендуется версия с плавающей запятой).

Основы рисования

Тестовый объект — QWidget, перегрузите функцию paintEvent для рисования, как показано ниже:

Текст: drawText

Очки: drawPoint, drawPoints

Линия: drawLine, drawLines

Ломаная линия: drawPolyline

Многоугольник: drawPolygon

Прямоугольник: drawRect, drawRects

Закругленный прямоугольник: drawRoundRect, drawRoundedRect

Эллипс: drawEllipse

Дуга: drawArc

Аккорд: drawChord

Круговая диаграмма: drawPie

Путь: drawPath

Изображение: drawPixmap, drawImage, drawPicture

Рисуем растровые изображения и изображения

Есть функция для рисования pixmap / image, а именноdrawPixma()drawImage()сdrawTiledPixmap()drawPixmap()сdrawImage()Оба дают одинаковый результат, за исключениемdrawPixmap()Быстрее на экранеПока вQPrinterИли drawImage () на других устройствахЭто могло быть быстрее.

ЕстьdrawPicture()Функция может рисовать содержимое всего QPicture. Функция drawPicture () — единственная функция, которая игнорирует все настройки рисования, потому что QPicture имеет свои собственные настройки.

Рисуйте пиксельные карты и версии изображений с высоким разрешением

Соотношение пикселей устройства версии пиксельной карты с высоким разрешением больше 1 (см. QImageReader, QPixmap :: devicePixelRotio ()). Если оно совпадает со значением базового QPaintDevice, оно передается непосредственно на устройство без применения других преобразований.

Например, при рисовании QPixmap 64×64 пикселя (соотношение пикселей устройства 2) на экране с высоким dpi соотношение пикселей устройства также равно 2. Обратите внимание, что растровое изображение составляет 32×32 пикселя в пользовательском пространстве. Путь кода, который вычисляет геометрию макета на основе размера растрового изображения в qt, будет использовать этот размер. В результате пиксельная карта отображается как пиксельная карта с высоким разрешением, а не как большая пиксельная карта.

Качество рендеринга

Чтобы использовать QPainter для получения наилучших результатов рендеринга, в качестве устройства рисования следует использовать независимый от платформы QImage; то есть использование QImage гарантирует, что результат будет иметь одинаковое представление пикселей на любой платформе.

Класс QPainter также предоставляет способ управления качеством рендеринга с помощью его перечисления RenderHint и поддержки точности с плавающей запятой: все функции, используемые для рисования примитивов, имеют версии с плавающей запятой. Обычно они используются вместе с рендерингом QPainer :: Antialiasing.

Сглаживание — один из параметров рендеринга QPainter по умолчанию. QPainter :: RenderHints используется для указания QPainter любых флагов, которым данный движок может или не может соответствовать. QPainter :: Antialising указывает, что движок должен в максимально возможной степени устранить сглаживание края примитива, то есть разместить дополнительные пиксели вокруг края примитива, чтобы сгладить край.

Разница между точностью с плавающей запятой и целочисленной точностью — это вопрос точности и видна в главном окне приложения: даже если логика вычисления геометрии круга одинакова, с плавающей запятой гарантируется, что размер пустого поля Между каждым кругом одно и то же, И целые числа заставляют два и два круга делать вид, что они принадлежат друг другу. Причина в том, что точность, основанная на целых числах, зависит от округления нецелочисленных вычислений.

Перечисление RenderHint определяет любые флаги QPainer, которым данный движок может или не может соответствовать.

  • QPainter::AntialiasingУказывает, что движок должен максимально устранять неровные края примитива.
  • QPainter::TextAntialiasingУказывает, что движок должен в максимальной степени устранять наложение текста
  • QPainter::SmoothPixMapTransformУказывает, что движок должен использовать алгоритм плавного преобразования растровых изображений.

renderHints() Функция функции — вернуть флаг, который используется для указания параметров визуализации, установленных для этой программы рисования. Используйте функцию setRenderHint (), чтобы установить или очистить текущие установленные RenderHints.

Преобразование координат

Обычно QPainter работает в собственной системе координат устройства (обычно в пикселях), но QPainter имеет хорошую поддержку преобразования координат.

Наиболее часто используемые преобразования — это масштабирование, вращение, перемещение и сдвиг. использоватьscale()Функция масштабирует систему координат по заданному смещению, используяrotate()Функция вращает систему координат по часовой стрелке, используяtranslate()Переведите систему координат (то есть добавьте заданное смещение к точке). Также можно использоватьshear()Функция деформирует систему координат вокруг начала координат. Для визуализации системы координат сдвига см. Пример аффинного преобразования.

Все операции преобразования преобразуютworldTransform()По эксплуатации. Матрица преобразует одну точку на плоскости в другую. Для получения дополнительной информации о матрице преобразования см. Систему координат и документацию QTransform.

setWorldTransform()Функция функции: заменить или добавить к текущей настройкеworldTransform()resetTransform()Функция функции — сбросить любые преобразования, выполненные с помощью функций translate (), scale (), shear (), rotate (), setworldTransform (), setviewport () и setwindow ().deviceTransform()Возвращает матрицу, преобразованную из логических координат в координаты устройства рисования, связанного с платформой. Последняя функция необходима только в том случае, если команда рисования платформы используется для зависимого от платформы дескриптора, и платформа не преобразуется естественным образом.

При рисовании с помощью QPainer мы используем логические координаты для указания точки, а затем преобразуем логические координаты в физические координаты устройства рисования. Преобразование логических координат в физические обеспечивается QPainercombinedTransform()viewport()сwindow()а такжеworldTransform()Комбинированная обработка.viewport()Представляет физические координаты произвольного прямоугольника,window()Опишите тот же прямоугольник в логических координатах,worldTransform()То же, что и матрица преобразования.

Резать

Функция отсечения состоит в том, чтобы управлять отображаемой областью элемента путем отсечения элемента, то есть в clip Содержимое в указанном диапазоне может отображаться, это использование произвольных форм QPainterPath В качестве QPainter из clip , Мы можем нарисовать желаемый эффект, например нарисовать круг и изображение звезды, показанные на рисунке выше.

QPainer может вырезать любую операцию рисования до прямоугольника, области или вектора. Текущий клип может использовать функции clipRegion () и clipPath ()). Выбор пути или области (быстрее) зависит от лежащего в основе paintEngine (). Например, механизм рисования QImage предпочитает путь, а механизм рисования x11 предпочитает область. Установка клипсы производится в логических координатах чертежа.

После того, как QPainter вырезан, устройство для рисования также можно вырезать. Например, большинство окон обрезают пиксели, используемые дочерними окнами, в то время как большинство принтеров обрезают область у края бумаги. Возвращаемое значение clipRegion () или hasClipping () не отражает этого дополнительного отсечения.

Режим синтеза

QPainer предоставляет перечисление QPainter :: CompositionMode, которое определяет правила Портера-Даффа для синтеза цифрового изображения; он описывает модель для объединения пикселей в одном изображении, источника и пикселей и целей в другом изображении.

Две наиболее распространенные комбинации — Source и SourceOver. Источник используется для рисования непрозрачных объектов на устройстве рисования. В этом режиме каждый пиксель в источнике заменяет соответствующий пиксель в цели. В режиме композиции SourceOver исходный объект является прозрачным и отображается поверх целевого объекта.

Обратите внимание, что комбинированная операция преобразования выполняется по пикселям. Следовательно, существует разница между использованием самого графического примитива и его ограничивающего прямоугольника: ограничивающий прямоугольник содержит пиксели с альфа == 0 (то есть пиксели вокруг примитива). Эти пиксели будут покрывать пиксели другого изображения, эффективно очищая эти пиксели, в то время как Источник покрывает только свою собственную область.

спектакль

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

Как высокопроизводительный движок, мы ориентируемся на следующие серверные части:

  • Растр — этот бэкэнд реализует весь рендеринг в чистом программном обеспечении и всегда используется для рендеринга как QImages.Для лучшей производительности используйте только типы форматовQImage::Format_ARGB32_Premultipled、QImage::Format_AGB32Или QImage :: Format_RGB16Производительность любого другого формата (включая QImage :: Format_ARGB32) значительно хуже. Этот движок по умолчанию используется QWidget и QPixmap.
  • OpenGL2.0 (es) — этот бэкэнд является основным сервером для аппаратно ускоренной графики. Он может работать на настольных компьютерах и встроенных устройствах, поддерживающих спецификации OpenGL 2.0 или OpenGL / ES 2.0. Сюда входит большинство графических чипов, выпущенных за последние несколько лет. Движок можно включить с помощью QPainer в QOpenGLWidget.

Эти операции включают:

  • Простое преобразование означает перевод и масштабирование, а также поворот на 0, 90, 180, 270 градусов.
  • drawPixmap () сочетает в себе простое преобразование и непрозрачность и режим негладкого преобразования (QPainter :: SmoothPixMapTransform не включен в качестве подсказки рендеринга).
  • Прямоугольник заполнен сплошными цветами, двухцветными линейными градиентами и простыми преобразованиями.
  • Обрезка прямоугольника с простым преобразованием и обрезкой пересечения.
  • Режимы композиции QPainter :: CompositionMode_Source и QPainter :: CompositionMode_SourceOver.
  • Залейте скругленный прямоугольник сплошным цветом и двухцветным линейным градиентом.
  • Пиксельная карта патча 3×3 через QDrawBorderPixmap.

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

Подробный перечень

Перечисление режимов наложения изображений: enum QPainter :: CompositionMode

Определите режимы, поддерживаемые синтезом цифрового изображения. Режим композиции используется для указания того, как пиксели одного изображения (источника) сочетаются с пикселями другого изображения (место назначения).

Обратите внимание, что режим работы с битовым растром (обозначается префиксом RasterOp) поддерживается только в механизмах рендеринга x11 и растра. Это означает, что единственный способ использовать эти режимы на Mac — через QImage. Перья и кисти (с альфа-компонентом) не поддерживают режим наложения, представленный RasterOp. Кроме того, включение приглашения рендеринга QPainer :: Antialiasing фактически отключит режим RasterOp.

Самый распространенный тип — SourceOver (часто называемыйalphaСмешивание можно понимать как цветовой канал пикселей), где исходный пиксель смешивается с целевым пикселем, так что альфа-компонент источника определяет полупрозрачность пикселя.

Некоторые режимы наложения требуют наличия альфа-канала в исходном изображении или целевом изображении для создания эффекта. Чтобы добиться максимальной производительности, лучше всего использовать формат изображения "format_ARGB8565_Premultiplied" (A-прозрачный, R-красный, G-зеленый, B-синий, 8565 представляет 8 бит, 5 бит, 6 бит, 5 бит в повернуть).

Когда режим композиции установлен, он применим ко всем манипуляторам рисования, перьям, кистям, градиентам и растровым изображениям / изображениям.

ценить

описание

QPainter::CompositionMode_SourceOver

Это режим "по умолчанию". Альфа источника используется для покрытия пикселей на цели.

QPainter::CompositionMode_DestinationOver

Цель alpha Используется для наложения источника на исходный пиксель. Этот режим такой же, как CompositionMode_SourceOver в отличие.

QPainter::CompositionMode_Clear

Пиксели в цели очищаются (становятся полностью прозрачными) независимо от источника.

QPainter::CompositionMode_Source

На выходе получается исходный пиксель. (Это означает базовую операцию копирования, и когда исходный пиксель непрозрачен SourceOver одинаковый).

QPainter::CompositionMode_Destination

На выходе получается целевой пиксель. Это означает, что перемешивание не имеет никакого эффекта. Этот режим противоположен CompositionMode_Source.

QPainter::CompositionMode_SourceIn

Выход — это источник, где alpha Целевые alpha Снижаться.

QPainter::CompositionMode_DestinationIn

На выходе получается цель, где альфа уменьшается на альфа источника. Этот режим противоположен CompositionMode_SourceIn.

QPainter::CompositionMode_SourceOut

Выход — это источник, где alpha Уменьшено инверсией цели.

QPainter::CompositionMode_DestinationOut

На выходе получается пункт назначения, где альфа вычитается на величину, обратную источнику. Этот режим противоположен CompositionMode_SourceOut.

QPainter::CompositionMode_SourceAtop

Исходный пиксель смешивается с целевым пикселем.

QPainter::CompositionMode_DestinationAtop

Целевой пиксель накладывается поверх исходного, и альфа-канал целевого пикселя уменьшается на альфа-канал целевого пикселя. Этот режим противоположен CompositionMode_SourceAtop.

QPainter::CompositionMode_Xor

Источник alpha И цель alpha Вычитает обратное, а цель alpha С источником alpha Вычтите обратную величину. CompositionMode_Xor В отличие от побитового XOR.

QPainter::CompositionMode_Plus

Альфа и цвет исходного и целевого пикселей складываются.

QPainter::CompositionMode_Multiply

Результатом будет исходный цвет, умноженный на целевой цвет. При умножении цвета на белый цвет останется неизменным, а при умножении цвета на черный получится черный.

QPainter::CompositionMode_Screen

Исходный и целевой цвета меняются местами, а затем умножаются. Маскирование цвета белым цветом дает белый цвет, а маскирование цвета черным не меняет цвет.

QPainter::CompositionMode_Overlay

Умножайте или фильтруйте цвета в соответствии с целевым цветом. Цвет назначения смешивается с исходным цветом, чтобы отразить яркость места назначения.

QPainter::CompositionMode_Darken

Выберите более темный цвет исходного и целевого цвета.

QPainter::CompositionMode_Lighten

Будет выбран светлый цвет исходного и целевого цвета.

QPainter::CompositionMode_ColorDodge

Целевой цвет становится ярче, чтобы отразить исходный цвет. Черный исходный цвет оставляет неизменным целевой цвет.

QPainter::CompositionMode_ColorBurn

Целевой цвет затемняется, чтобы отразить исходный цвет. Белый исходный цвет остается целевым цветом.

QPainter::CompositionMode_HardLight

Умножайте или фильтруйте цвета на основе исходных цветов. Цвет источника света сделает целевой цвет ярче, а цвет темного источника света затемнит целевой цвет.

QPainter::CompositionMode_SoftLight

Сделайте цвет темнее или светлее в соответствии с исходным цветом. Похожий на CompositionMode_HardLight 。

QPainter::CompositionMode_Difference

Вычтите более темный цвет из более светлого. При рисовании белым будет инвертирован целевой цвет, а при рисовании черным — целевой цвет останется неизменным.

QPainter::CompositionMode_Exclusion

Аналогично разнице в композитном режиме, но с меньшей контрастностью. При рисовании белым будет инвертирован целевой цвет, а при рисовании черным — целевой цвет останется неизменным.

QPainter::RasterOp_SourceOrDestination

Выполните побитовую операцию ИЛИ над исходным и целевым пикселями (src OR dst).

QPainter::RasterOp_SourceAndDestination

Для исходного и целевого пикселей ( src AND dst ) Выполните побитовую операцию И.

QPainter::RasterOp_SourceXorDestination

Выполните побитовую операцию XOR для исходного и целевого пикселей (src XOR dst).

QPainter::RasterOp_NotSourceAndNotDestination

Для исходного и целевого пикселей ( (NOT src) AND (NOT dst) ) Выполнить побитовое “ или же ” Операция.

QPainter::RasterOp_NotSourceOrNotDestination

Выполните побитовую операцию NAND для исходного и целевого пикселей ((НЕ src) ИЛИ (НЕ dst)).

QPainter::RasterOp_NotSourceXorDestination

Выполните побитовую операцию, при которой исходный пиксель инвертируется, а затем целевой ( (NOT src) XOR dst ) Выполните операцию исключающее ИЛИ.

QPainter::RasterOp_NotSource

Выполните побитовую операцию (НЕ src) в позиции, где исходный пиксель инвертирован.

QPainter::RasterOp_NotSourceAndDestination

Выполните поразрядную операцию, при которой источник переворачивается, а затем цель ( (NOT src) AND dst ) использовать вместе.

QPainter::RasterOp_SourceAndNotDestination

Выполните побитовую операцию, где source и ed используют перевернутые пиксели назначения (src AND (NOT dst)

QPainter::RasterOp_NotSourceOrDestination

Выполните поразрядную операцию, при которой источник переворачивается, а затем цель ( (NOT src) OR dst ) Выполнить или выполнить вместе.

QPainter::RasterOp_SourceOrNotDestination

Выполните битовую операцию, где источником является целевой пиксель, который является OR ‘и инвертирован (src OR (NOT dst)).

QPainter::RasterOp_ClearDestination

Пиксели в цели очищаются ( set to 0 ), не имеет ничего общего с источником.

QPainter::RasterOp_SetDestination

Настройка пикселей (установленная на 1) в цели не зависит от источника.

QPainter::RasterOp_NotDestination

Выполните инверсию целевого пикселя ( NOT dst ) Побитовая операция.

Перечисление прозрачности пикселей: enum QPainter :: PixmapFragmentHint, flags QPainter :: PixmapFragmentHints

Константа перечисления

ценить

описание

QPainter::OpaqueHint

Указывает, что рисуемый фрагмент растрового изображения непрозрачен. Скорость рисования непрозрачных фрагментов может быть выше.

Это перечисление было введено или изменено в Qt4.7.

Тип PixmapFragmentHints переопределяется QFlags <PixmapFragmentHint>. Он хранит значение PixmapFragmentHint или его комбинацию.

Перечисление визуализации: enum QPainter :: RenderHint, flags QPainter :: RenderHints

RenderInts используется для указания QPainer любых признаков, которым данный движок может соответствовать или не соответствовать.

Константа перечисления

ценить

описание

QPainter::OpaqueHint

Указывает, что рисуемый фрагмент растрового изображения непрозрачен. Скорость рисования непрозрачных фрагментов может быть выше.

QPainter::TextAntialiasing

Поручите движку максимально исключить наложение текста. Чтобы принудительно отключить сглаживание текста, не используйте эту подсказку. Вместо этого установите стратегию стиля шрифта QFont::NoAntialias 。

QPainter::SmoothPixmapTransform

Указывает механизму использовать алгоритмы плавного преобразования растровых изображений (например, билинейные) вместо ближайшего соседа.

QPainter::HighQualityAntialiasing

Это значение устарело и будет проигнорировано, используйте вместо него подсказки рендеринга со сглаживанием.

QPainter::NonCosmeticDefaultPen

Это значение устарело, и значение по умолчанию qpen теперь не отображается.

QPainter::Qt4CompatiblePainting

Советы по совместимости, скажите движку использовать qt 4 На основе x11 Правило заполнения, при котором смещение рендеринга псевдонима немного меньше половины пикселя. Перьевая ручка конфигурации по умолчанию также считается пером внешнего вида. буду Qt4 Приложение перенесено на Qt5 Иногда может быть полезно.

Тип RenderInts — это предопределенный тип QFlags <RenderInt>. Он хранит одно или несколько значений RenderInt.

Qt/C++ — Урок 020. QPainter — знакомство с рисованием в Qt

Во фреймворке Qt имеется возможность рисовать как на графической сцене , так и прямо на виджетах. Для этого используется класс QPainter. Рисование объектов на виджетах может производится в функции paintEvent(*event) , которая вызывается при отрисовке виджета.

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

Структура проекта для QPainter

Проект содержит следующие файлы:

  • painter.pro — профайл проекта;
  • widget.h — заголовочный файл класса, в котором и производится работа с QPainter;
  • widget.cpp — файл исходных кодов по работе с QPainter;
  • main.cpp — запускающий файл проекта;
  • widget.ui — интерфейс приложения.

widget.ui

В дизайнере форм добавляем в виджет GroupBox с радиобаттонами и вертикальный spacer.

Внешний вид приложения

widget.h

В данном файле только определяем метод paintEvent() .

widget.cpp

А вот логика работы приложения полностью помещается в данный файл. В методе paintEvent() реализуем опрос радиобаттонов и по их состоянию рисуем круг на основном виджете.

В результате у Вас получится приложение, показанное на ниже следующем рисунке. Демонстрация работы приложения присутствует в видеоуроке по данной статье.

Архив с исходниками: painter

Рекомендуем хостинг TIMEWEB

Рекомендуем хостинг TIMEWEB

Рекомендуемые статьи по этой тематике

По статье задано2 вопрос(ов)

Подписчики
Платёжная система
  • 86974
  • 0
  • 2
  • 0

Доброго времени суток. Подскажите, пожалуйста, следующую вещь: что такое private slots: void on_radioButton_red_clicked(); void on_radioButton_green_clicked(); void on_radioButton_blue_clicked(); Откуда они взялись. Это какие — то предопределенные слоты класса radiobutton. Почему они исполняются при нажатии переключателей. Хоть убей, не пойму. Никакой инфы не нашел. Где они задаются привязанными к переключателям При попытке изменить имя слотов, они перестают работать. Сформулирую вопрос иначе: Где связываются переключатели и эти три слота.

  • 0
  • 0
  • 0
    ИсходныйКот
  • 22 марта 2017 г. 22:19

Зы, т.е. если, я переименовываю слот, скажем,с void on_radioButton_blue_clicked() на void blue_clicked() в файлах widget.h и widget.cpp, все компилируется, но, переключатель radioButton_blue перестает работать ЗЫ: компилирую пример в Visual Studio. Creatorom и Designerom не пользуюсь. Эти слоты привязываются где — то в них?

  • 0
  • 0
  • 0
    ИсходныйКот
  • 22 марта 2017 г. 23:02

Да. Совершенно верно. Данные слоты создаются через дизайнер. Если в дизайнере кликнуть правой кнопкой мыши на какой-то объект и выбрать создание слота clicked() , то будет выглядеть примерно так, как показано в примере.

Qt имеет этап предкомпиляции, когда создаются всякие мок файлы, и в данном случае привязка идёт по текстовому наименованию слота. Если слот не находится, то он не подключается во время компиляции.

Вы должны будете найти подключение этих слотов в ui_widget.h , который автоматически создаётя во время компиляции.

  • 0
  • 0
  • 0
    Евгений Легоцкой
  • 23 марта 2017 г. 1:53

Понятно,спасибо,посмотрю. У нас,в виду исторических обстоятельств,весь код писан чисто в vs,без использования креатора(когда собирали qt под студии,креатор,даже,не компилировали),все интерфейсы писались через кодирование,и,все эти ui для меня темный лес. интересно расширить познания в этой области))

  • 0
  • 0
  • 0
    ИсходныйКот
  • 23 марта 2017 г. 9:35

Проект, в котором я работаю на данный момент развивается уже более 5-ти лет. Я в нём работаю последние 8 месяцев. Интерфейс полностью написан на Ui, причём с использованием плагинов для Qt Designer, также над продуктом работает команда переводчиков. В продукте сотни диалоговых окон. И из своих наблюдений могу сказать, что если бы не использовались Ui, то в какой-то момент работать стало бы очень грустно, причём не только программистам, но и переводчикам, поскольку тот же самый Qt Linguist, поддерживает отображение Ui файлов, что гораздо удобнее, чем смотреть в код и не понимать, к какому всё-таки окну это относится.

  • 0
  • 1
  • 0
    Евгений Легоцкой
  • 23 марта 2017 г. 13:16

У программы нас не имеют статических окошек, как таковых — окна могут быть совершенно различными в зависимости от множества условий, и, «лепятся», прямо, на лету, при запуске. Те, кто начинал проекты, выбрали чистый код, и, тем кто с ними работает сейчас, приходится делать все без использования ui, либо, все переписывать, а, это не на один год работы — проекты большие,ведутся лет 20, множество модулей написаны на всем, что можно только себе вообразить, начиная от ассемблера(работаем с железом и драйверами, в том числе) и заканчивая C#, и, все это завязано на кроссплатформенный qt, поскольку, поддерживается и Линупс. Старая команда отвалила, набрали новыю. Переписывать все жестоко, да, и, опыта у меня маловато

  • 0
  • 0
  • 0
    Евгений Легоцкой
  • 23 марта 2017 г. 15:03

Увидел, еще, один интересный момент. Вы написали про редактирование слота clicked(), а, в дизайнере я этой возможности не нашел, но, тут такой момент. у меня qt собрана самостоятельно, без creator-a, есть, только, дизайнер. А, в дизайнере нет поддержки слотов(по правой клавише мыши). Потом, поставил Creator, а, там, дизайнер открывается в контексте проекта, вот, там создание слота clicked,уже есть. Про этот момент я не знал, поэтому, и, не нашел в дизайнере, как создать слот. В новых версиях qt создание слотов из дизайнера вынесли.

  • 0
  • 0
  • 0
    ИсходныйКот
  • 23 марта 2017 г. 16:13

Но согласитесь, что отсутствие ui — это проблема того, что проекты давно развиваются, имеется много легаси кода и того, что на момента развития проектов и сам Qt не был так сильно развит. Например, Qt4 и Qt5 довольно сильно различаются, да даже Qt 5.6 очень отличается от Qt 5.8 по некоторым модулям, особенно если полезть в сторону QML. А после пары калымов я вовсе зарёкся браться за проекты с Qt4, особенно те, которые пишутся на устаревших версиях VS. Наверняка, многое можно стандартизировать и шаблонизировать. В нашем проекте сотни диалоговых окон с ui, но все они создаются и наполняются динамически. А также имеют всего несколько базовых классов. Просто различные вкладки интерфейса скрываются или добавляются в зависимости от этих самых условий, про которые вы сказали. Ну а так да. — Переписывать всё действительно жёстко, если проекты давно развиваются, но это уже немного другая история.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *