QScrollBar、QSlider点击跳转思路及实现
思路
不管是ScrollBar还是QSlider本质上都是将range value归化到滚动条的长度范围,所以只要我们计算出点击位置占整个进度条的百分比然后乘maxvalue就是当前value值,公式为
(点击坐标x值/进度条有效宽度)*Maximum
根据横纵选择x ,y及宽高来计算
实现
class CusScrollBar: public QScrollBar {
Q_OBJECT
public:
explicit CusScrollBar(QWidget *parent = nullptr): QScrollBar(parent) {
}
explicit CusScrollBar(Qt::Orientation orient, QWidget *parent = nullptr): QScrollBar(orient, parent) {
}
// 方法是鼠标点击事件
void mousePressEvent(QMouseEvent *e) override {
QScrollBar::mousePressEvent(e);
QStyleOptionSlider opt;
initStyleOption(&opt);
//计算按钮控件边框
QRect btnRect = style()->subControlRect(QStyle::CC_ScrollBar, &opt,
QStyle::SC_ScrollBarAddLine, this);
//判断当前是横向还是纵向
if(Qt::Horizontal == orientation()) {
int btnw = btnRect.width();
if(e->x() > btnw && e->x() < width() - btnw) {
double percent = static_cast<double>(e->x() - btnw) / static_cast<double>(width() - 2 * btnw);
percent = percent > 1 ? 1 : percent;
int clickValue = (minimum() + (maximum() - minimum()) * percent);
setValue(clickValue);
}
} else {
int btnh = btnRect.height();
if(e->y() > btnh && e->y() < height() - btnh) {
double percent = static_cast<double>(e->y() - btnh) / static_cast<double>(height() - 2 * btnh);
percent = percent > 1 ? 1 : percent;
int clickValue = (minimum() + (maximum() - minimum()) * percent);
setValue(clickValue);
}
}
}
};
其它
- 如果不想继承可以直接安装过滤器,事件过滤中处理计算,QSlider不需要计算两端按钮可以使用此种方法实现,此处不做处理