是否可以根据QSlider手柄的位置改变其颜色?

协会

我非常了解如何通过样式表来自定义QSlider,但是我想知道是否可以执行以下操作:

                                              在此处输入图片说明

我希望滑块的手柄从蓝色变为黄色。当设置在左边时,它是蓝色的。当您将其向右移动时,它将具有从蓝色到黄色的渐变。

如果可以通过样式表,该怎么办?如果没有,如何在QSlider的子类的paintEvent中实现呢?

德泰

实际上,您实际上并不需要做任何花哨的事情,因为库存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的范围内找到相对的手柄位置,并使用它来混合fromto颜色以将手柄颜色设置为相应的值。奇怪的是,QColor没有运算符可以进行乘加运算,这很方便。

在此处输入图片说明

另外,您可以构建HSL格式的颜色,而不是将两种颜色混合使用,这将为您提供稍微不同的渐变。from/toQColor分别更改为色调42和202,您可以:

QColor c = QColor::fromHsl(205 - (205 - 42) * rv, 200, 135);

这将为您提供色相的扫色,而不是两种固定颜色之间的混合,这可能更适合于温度情况:

在此处输入图片说明

请注意,现在在中间,您会获得青色的颜色,而不是“僵尸”绿色,并且在获得橙色之前要经过干净的绿色。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章