Qt滑动条解决点击和拖动问题

QSlider在默认情况下,点击非滑块部分时无法直接跳转到点击位置,导致操作不流畅。本文介绍了两种解决方法:一是通过添加事件过滤器处理QSlider的mousePressEvent和mouseMoveEvent;二是选择继承QSlider并重写相关事件函数,以实现更顺畅的滑动条交互体验。

QSlider 在点击非滑块部分时,不会直接到点击位置,而是一步一步执行,在项目中使用时会感觉不流畅。可以通过改变QSlider的鼠标点击事件(mousePressEvent)和鼠标移动事件(mouseMoveEvent)解决。

使用原QSlider

如UI中使用verticalSlider,MySliderUI.h 头文件:

class MySliderUI : public QWidget
{
    Q_OBJECT
public:
    explicit MySliderUI(QWidget *parent = 0);
    ~MySliderUI();
protected:
    bool eventFilter(QObject *obj, QEvent *event);

private:
    Ui::EpsSliderUI *ui;
};

MySliderUI.cpp

MySliderUI::MySliderUI(QWidget *parent) :
    QWidget(parent)
{
    ui->slider->installEventFilter(this);
}

添加事件过滤,对QSlider的事件重新处理。

bool MySliderUI::eventFilter(QObject *obj, QEvent *event)
{
    if( obj == ui->slider)
    {
        if (event->type() == QEvent::MouseButtonPress)
        {
            QMouseEvent *mouseEvent = static_cast<QMouseEvent *>(event);
            if (mouseEvent->button() == Qt::LeftButton)
            {
                ui->slider->event(event);
                double pos = mouseEvent->pos().y() / (double)ui->slider->height();
            	int value =  pos * (ui->slider->maximum() - ui->slider->minimum()) 
            					  + ui->slider->minimum()+0.5;
                ui->slider->setValue(value);
                return true;
            }
        }
        else if (event->type() == QEvent::MouseButtonDblClick)
        {
            return true;
        }
        else if (event->type() == QEvent::MouseMove)
        {
            QMouseEvent *mouseEvent = static_cast<QMouseEvent *>(event);
            ui->slider->event(event);
            double pos = mouseEvent->pos().y() / (double)ui->slider->height();
            int value =  pos * (ui->slider->maximum() - ui->slider->minimum()) 
            					+ ui->slider->minimum()+0.5;
            ui->slider->setValue(value);
            return true;
        }
    }
    return QObject::eventFilter(obj,event);
}

继承QSlider,重写事件函数

头文件

class MySlider : public QSlider
{
    Q_OBJECT
public:
    MySlider(QWidget *parent = nullptr);
    ~MySlider();

protected:
    void mousePressEvent(QMouseEvent *event);  //单击
    void mouseMoveEvent(QMouseEvent *event);
};

实现文件

#include "myslider.h"
#include <QMouseEvent>

MySlider::MySlider(QWidget *parent)
    :QSlider (parent)
{
}

MySlider::~MySlider()
{
}

void MySlider::mousePressEvent(QMouseEvent *event)
{
    if (event->button() == Qt::LeftButton)	//判断左键
    {
        //注意应先调用父类的鼠标点击处理事件,这样可以不影响拖动的情况
        QSlider::mousePressEvent(event);
        double pos = ((double)height() - event->pos().y()) / (double)height();
        int value = pos * (maximum() - minimum()) + minimum();
        setValue(value);
    }
}
void MySlider::mouseMoveEvent(QMouseEvent *event)
{
    //注意应先调用父类的鼠标点击处理事件,这样可以不影响拖动的情况
    QSlider::mouseMoveEvent(event);
    double pos =  ((double)height() - event->pos().y()) / (double)height();
    int value = pos * (maximum() - minimum()) + minimum();
    setValue(value);
}

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值