Это больше вопрос о цветовых моделях, чем Qt, но в основном вы пытаетесь сделать полный круг по краю HSL цветовой модели , сохраняя насыщенность.
Чтобы создать нечто подобное в Qt, вы будете использовать кисть градиента;так как мы хотим непрерывного смешивания, я использовал QLinearGradient .Если вы посмотрите на цветовое колесо выше, вы заметите, что красный цвет находится на 0 градусов, зеленый на 120 градусов, а синий на 240 градусов.QLinearGradient работает с диапазоном от 0 до 1, поэтому он преобразуется в 0, 1/3, 2/3 соответственно.Нам также нужно добавить конечную остановку, которая вернет градиент к красному цвету.
Я добавил немного альфа-канала, чтобы подавить цветовой тон, чтобы вы могли поэкспериментировать с этим;окончательный код будет выглядеть примерно так:
class ColorScale : public QWidget {
Q_OBJECT
public:
using QWidget::QWidget;
protected:
void paintEvent(QPaintEvent *event) override {
QPainter painter(this);
painter.setOpacity(0.9);
painter.setRenderHint(QPainter::HighQualityAntialiasing);
QLinearGradient gradient(0, 0, 0, height());
QGradientStops stops;
stops << QGradientStop(0, Qt::red);
stops << QGradientStop(1.0/3, Qt::blue);
stops << QGradientStop(2.0/3, Qt::green);
stops << QGradientStop(1, Qt::red);
gradient.setStops(stops);
painter.fillRect(rect(), gradient);
}
};
И он выдаст это:
Вы можете добавить метки, вызвав QPainter :: DrawText .