Qt QScrollBar点击长条任意处即可跳到相应位置并可拖动

QScrollBar 并没有方法点到那进度条跳转到相应的位置,拖动倒是有相关方法,但是跳转功能与拖动会有冲突,所以说两个功能都要重写了。

这里有两种方法,1.使用原生的QScrollBar(本博主也是用的这个办法),2重写QScrollBar响应的时间mousePressEvent和mouseMoveEvent,3其他思路

1.原生的QScrollBar要用eventFilter去处理QScrollBar相应的鼠标按下和移动事件

// .h文件
void mousePressEvent(QMouseEvent* event) ;
//.cpp里
ui.controlSlider->installEventFilter(this);
bool SLGeneralDlg::eventFilter(QObject* obj, QEvent* event)
{
	if (obj == ui.controlSlider)
	{
		QString strtype = event->type();
		if (event->type() == QEvent::MouseButtonPress)        //判断类型
		{
			QMouseEvent* mouseEvent = static_cast<QMouseEvent*>(event);
			if (mouseEvent->button() == Qt::LeftButton)	//判断左键
			{
				int i = ui.controlSlider->minimum();
				int j = ui.controlSlider->maximum();
				int widget = ui.controlSlider->width();
				int value = QStyle::sliderValueFromPosition(ui.controlSlider->minimum(), ui.controlSlider->maximum(), mouseEvent->pos().x(), ui.controlSlider->width());
				// ui.controlSlider->setValue(value);
				emit SendSoilder(value);   //可以直接setValue
				return true;
			}
		}
		else if (event->type() == QEvent::MouseMove)        //判断是移动鼠标
		{
			QMouseEvent* mouseEvent = static_cast<QMouseEvent*>(event);
			ui.controlSlider->event(event);
			double pos = mouseEvent->pos().y() / (double)ui.controlSlider->height();
			int value = QStyle::sliderValueFromPosition(ui.controlSlider->minimum(), ui.controlSlider->maximum(), mouseEvent->pos().x(), ui.controlSlider->width());
			ui.controlSlider->setValue(value);
			return true;
		}
	}
	return QObject::eventFilter(obj, event);
}

 关于要不要写鼠标移动事件讨论?这里返回值QObject::eventFilter(obj, event)和true区别,是因为在测试发现个别QScrollBar(不写鼠标事件)在最左和最优会移动不到位 或者拖拽时候拖拽不动。导致原因测试应该也是返回值导致的。

2.QSlider重写事件

// .h
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);
}

3.重绘QSlider 其他重写事件

【Qt】自定义的可拖动的Slider_芒果黑的博客-CSDN博客_qt double slider

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

路奇怪

有钱出钱,没钱多出编程主意啊

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值