实际上,您实际上并不需要做任何花哨的事情,因为库存QSlider
已经有了valueChanged(int)
信号,因此您可以将其连接到根据位置在两种颜色之间混合并设置样式颜色的功能。这是一个最小的示例:
static QColor operator+(const QColor & a, const QColor & b) {
return QColor(a.red() + b.red(), a.green() + b.green(), a.blue() + b.blue());
}
static QColor operator*(const QColor & c, const qreal r) {
return QColor(c.red() * r, c.green() * r, c.blue() * r);
}
class Widget : public QWidget {
Q_OBJECT
public:
Widget(QWidget *parent = 0) : QWidget(parent), from(248, 181, 20), to(64, 150, 214) {
auto l = new QHBoxLayout(this);
setLayout(l);
s = new QSlider(Qt::Horizontal, this);
s->setMinimum(0);
s->setMaximum(100);
l->addWidget(s);
connect(s, &QSlider::valueChanged, this, &Widget::colorize);
colorize(s->value());
}
private:
void colorize(int v) {
int d = s->maximum() - s->minimum();
v = v - s->minimum();
qreal rv = qreal(v) / d;
QColor c = from * rv + to * (1.0 - rv);
s->setStyleSheet(QString("QSlider::handle:horizontal {background-color: %1;}").arg(c.name()));
}
QSlider * s;
QColor from, to;
};
这将适用于任何滑块范围和方向,代码基本上会在0.0到1.0的范围内找到相对的手柄位置,并使用它来混合from
和to
颜色以将手柄颜色设置为相应的值。奇怪的是,QColor
没有运算符可以进行乘加运算,这很方便。
另外,您可以构建HSL格式的颜色,而不是将两种颜色混合使用,这将为您提供稍微不同的渐变。from/to
从QColor
分别更改为色调42和202,您可以:
QColor c = QColor::fromHsl(205 - (205 - 42) * rv, 200, 135);
这将为您提供色相的扫色,而不是两种固定颜色之间的混合,这可能更适合于温度情况:
请注意,现在在中间,您会获得青色的颜色,而不是“僵尸”绿色,并且在获得橙色之前要经过干净的绿色。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句