БлогNot. QT: рисуем цветовой круг HSV

QT: рисуем цветовой круг HSV

Не просто "радужный круг" скриптом, а более-менее правильный круг в цветовой модели HSV (перед выводом на форму цвет пересчитывается в RGB функцией hsvToRgb).

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

цветовой круг HSV
цветовой круг HSV

Реализовано в виде виджета QT 5.X и проверено в сборке QT 5.14.2. Ниже приводится содержательная часть кода (на момент написания) и архив с проектом.

#include <QPainter>
#include <QPaintEvent>
#include <cmath>

Widget::Widget(QWidget *parent) : QWidget(parent) {
 setWindowTitle(tr("Color Wheel"));
 resize(400, 400);
}

void Widget::paintEvent(QPaintEvent *event) {
 QPainter painter(this);
 painter.setRenderHint (QPainter::Antialiasing);
 const QColor backgroundColor(255, 255, 255); //фоновый цвет
 const QColor white(255, 255, 255); //БЕЛЫЙ цвет, для вычислений
 painter.fillRect(event->rect(), backgroundColor);
 const int margin = 10;
 const double diameter = std::min(width(), height()) - 2*margin;
 QPointF center(width()/2.0, height()/2.0);
 QRectF rect(center.x() - diameter/2.0, center.y() - diameter/2.0, diameter, diameter);
 for (double angle = 0; angle < 360; angle+=0.5) { //шаг по углу можно менять
  QColor color(hsvToRgb(angle, 1.0, 1.0));
  QRadialGradient gradient(center, diameter/2.0);
  gradient.setColorAt(0, white);
  gradient.setColorAt(1, color);
  QBrush brush(gradient);
  QPen pen(brush, 1.0);
  painter.setPen(pen);
  painter.setBrush(brush);
  painter.drawPie(rect, angle * 16, 16);
 }
}

QColor Widget::hsvToRgb(double h, double s, double v) {
 double hp = h/60.0;
 double c = s * v;
 double x = c * (1 - std::abs(std::fmod(hp, 2) - 1));
 double m = v - c;
 double r = 0, g = 0, b = 0;
 if (hp <= 1) {
  r = c;
  g = x;
 }
 else if (hp <= 2) {
  r = x;
  g = c;
 }
 else if (hp <= 3) {
  g = c;
  b = x;
 }
 else if (hp <= 4) {
  g = x;
  b = c;
 }
 else if (hp <= 5) {
  r = x;
  b = c;
 }
 else {
  r = c;
  b = x;
 }
 r += m;
 g += m;
 b += m;
 return QColor(r * 255, g * 255, b * 255);
}

 Скачать этот виджет в виде архива .zip с проектом QT 5.X, папка уже создана внутри архива (2 Кб)

08.11.2020, 14:56 [1906 просмотров]


теги: c++ цвет графика qt

К этой статье пока нет комментариев, Ваш будет первым