由于Qt自带的QSlider自身的限制,无法获得像iOS中的那种滑动条的效果,于是自己做了一个出来
实现原理很简单,使用原有控件组合的方式就可以了
第一步, 继承QWidget 创建一个RichSlider
第二步, 在RichSlider 上先后放置两个QLabel, 然后清空文字内容,设置objName为bgLabel(滑动条背景)、frontLabel (滑动条前景),接着拖动一个QPushButton上去, 清空文本
第三步, 按下面图片中给三个子控件进行布局
第四步, 给RichSlider设置样式表来设置各个子控件的背景色和圆角半径
QLabel#bgLabel {
border-radius: 4px;
background-color: gray;
}
QLabel#frontLabel {
border-radius: 4px;
background-color: green;
}
QPushButton#trackButton {
border-radius: 8px;
background-color: white;
}
第五步, 完善头文件中的接口, 包括属性和方法(如setValue(double)等,还有重要的信号valueChanged(double), 本控件中value的值限制在了(0.0 ~ 1.0)直接, 超出范围的值自动忽略
#ifndef RICHSLIDER_H
#define RICHSLIDER_H
#include <QWidget>
#include <QColor>
namespace Ui {
class RichSlider;
}
class RichSlider : public QWidget
{
Q_OBJECT
Q_PROPERTY(double value READ value WRITE setValue NOTIFY valueChanged)
Q_PROPERTY(int tintHeight READ tintHeight WRITE setTintHeight)
Q_PROPERTY(QColor frontTintColor READ frontTintColor WRITE setFrontTintColor)
Q_PROPERTY(QColor backgroundTintColor READ backgroundTintColor WRITE setBackgroundTintColor)
Q_PROPERTY(QColor trackTintColor READ trackTintColor WRITE setTrackTintColor)
public:
explicit RichSlider(QWidget *parent = 0);
~RichSlider();
double value() const;
void setValue(double value);
QColor backgroundTintColor() const;
void setBackgroundTintColor(const QColor &color);
QColor frontTintColor() const;
void setFrontTintColor(const QColor& color);
QColor trackTintColor() const;
void setTrackTintColor(const QColor& color);
QString trackButtonImage() const;
void setTrackButtonImage(const QString& path);
int tintHeight() const;
void setTintHeight(int height);
protected