c++ - 是否可以根据其位置更改 QSlider handle 的颜色?

标签 c++ qt qtstylesheets qslider

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

enter image description here

我希望 slider 的 handle 从蓝色变为黄色。当设置在左边时,它是蓝色的;当您将它向右移动时,它会出现从蓝色到黄色的渐变。

如果可以通过样式表实现,怎么做?如果不能,我如何在 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;
};

这适用于任何 slider 范围和方向,代码基本上在 0.0 到 1.0 范围内找到相对 handle 位置,并使用它来混合 fromto 颜色将 handle 颜色设置为相应的值。奇怪的是,QColor 没有可以派上用场的乘法和加法运算符。

enter image description here

此外,您可以构建 HSL 格式的颜色,而不是混合两种颜色,这会给您带来略微不同的渐变。将 from/toQColor 分别更改为色调 42 和 202,然后您可以:

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

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

enter image description here

请注意,现在在中间,您会看到青色而不是“僵尸”绿色,并且在到达橙色之前先穿过干净的绿色。

关于c++ - 是否可以根据其位置更改 QSlider handle 的颜色?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40132553/

相关文章:

c++ - 在不知道最后一个元素位置的情况下向后比较两个数组

c++ - 在另一个 qmake 项目中包含一个 qmake 项目

qt - 如何在自定义样式表中使用 SP_* 图标?

python - 如何更改 QPushButton 文本和背景颜色

c++ - 无法使用 qss 文件设置样式表属性

c++ - 基于数组的列表 - 插入函数

c++ - 编码比赛 : How to store large numbers and find its all combination modulus P

c++ - 移动构造函数调用基类移动构造函数

qt - 这是一个不好的做法吗 : embed QML in a QT dockable widgets application?

c++ - 每个 QFont 的新 QFontDialog?