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 其他重写事件