QScrollBar、QSlider点击跳转思路及实现

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不需要计算两端按钮可以使用此种方法实现,此处不做处理
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值