qlineargradient горизонтальный & amp; вертикальный

я пытаюсь сгенерировать интерактивный виджет цветового пространства HVS, используя QGraphicsView. Фон всего QGraphicsView должен быть похож на изображение ниже (без jpeg-артефактов). Нажатие в позиции x, y даст цвет под курсором.

введите описание изображения здесь

Я не хочу использовать изображение напрямую, вместо этого я подумал об использовании qlineargradient в обоих направлениях (горизонтальный & вертикальный) с использованием qstylesheets. На самом деле я не могу понять, как это сделать!

Простое использование горизонтальных цветовых поверхностей прямо вперед, я не могу понять, как добавить дополнительный вертикальный (белый-черный-черный) градиент. Что я получил до сих пор (внутри конструктора унаследованного класса от QGraphicsView):

QColor hsvColor[6];
hsvColor[0].setHsv(0, 255, 255);
hsvColor[1].setHsv(60, 255, 255);
hsvColor[2].setHsv(120, 255, 255);
hsvColor[3].setHsv(180, 255, 255);
hsvColor[4].setHsv(240, 255, 255);
hsvColor[5].setHsv(300, 255, 255);

QString styleH = QString("background-color: qlineargradient(spread:pad, x1:0, y1:0, x2:1, y2:0,") +
QString("stop:0.000 rgba(%1, %2, %3, 255),").arg( hsvColor[0].red() ).arg( hsvColor[0].green() ).arg( hsvColor[0].blue() ) +
QString("stop:0.166 rgba(%1, %2, %3, 255),").arg( hsvColor[1].red() ).arg( hsvColor[1].green() ).arg( hsvColor[1].blue() ) +
QString("stop:0.333 rgba(%1, %2, %3, 255),").arg( hsvColor[2].red() ).arg( hsvColor[2].green() ).arg( hsvColor[2].blue() ) +
QString("stop:0.500 rgba(%1, %2, %3, 255),").arg( hsvColor[3].red() ).arg( hsvColor[3].green() ).arg( hsvColor[3].blue() ) +
QString("stop:0.666 rgba(%1, %2, %3, 255),").arg( hsvColor[4].red() ).arg( hsvColor[4].green() ).arg( hsvColor[4].blue() ) +
QString("stop:0.833 rgba(%1, %2, %3, 255),").arg( hsvColor[5].red() ).arg( hsvColor[5].green() ).arg( hsvColor[5].blue() ) +
QString("stop:1.000 rgba(%1, %2, %3, 255));").arg( hsvColor[0].red() ).arg( hsvColor[0].green() ).arg( hsvColor[0].blue() );
this->setStyleSheet(styleH);

Это дает мне:

введите описание изображения здесь

Я попробовал некоторое время, теперь спрашиваю здесь:

Можно ли нарисовать xy-градиент, как описано выше, используя qlineargradient & qstylesheets?

Может, кто-нибудь подскажет, как это сделать, используя qstylesheets …

Большое спасибо, в натуральном выражении XAM

3

Решение

Я знаю, что это довольно старое сейчас, но это все еще может помочь другим.

Таким образом, основной трюк заключается в том, чтобы в вашем QGraphicsView было 2 градиента, один из которых был задан в качестве фона для цветов (слева направо), а другой — как передний план (сверху вниз).

// a colored background based on hue
QLinearGradient colorGradient = QLinearGradient(0, 0, width(), 0);
colorGradient.setSpread(QGradient::RepeatSpread);
colorGradient.setColorAt(0, QColor(255,255,255));
colorGradient.setColorAt(1, currentHue);

QLinearGradient blackGradient = QLinearGradient(0, 0, 0, height());
blackGradient.setSpread(QGradient::RepeatSpread);
blackGradient.setColorAt(0, QColor(0,0,0,0));
blackGradient.setColorAt(1, QColor(0,0,0,255));QBrush colorGradiantBrush = QBrush(colorGradient);
QBrush blackGradiantBrush = QBrush(blackGradient);
scene.setBackgroundBrush(colorGradiantBrush);
scene.setForegroundBrush(blackGradiantBrush);

Код выше дает вам палитру с одним цветом, как это:

результат

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

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]