QT: рисуем цветовой круг HSV
Не просто "радужный круг" скриптом, а более-менее правильный круг в цветовой модели HSV (перед выводом на форму цвет пересчитывается в RGB функцией hsvToRgb
).
Вот как это выглядит, если увеличить размер окна, круг перерисуется.
цветовой круг 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 просмотров]