PyQt5之实现QSlider进度条的点哪指哪

前言:最近在做项目的播放器部分,但在进度条部分却遭遇了问题,QSlider本身是支持滑块拖动和点击事件的,但QSlider的点击事件并不是点哪跳哪,而是点一下,会根据QSLider的步进增一步或减一步。

无论遇到什么问题,我们都要···干就完了,OLG!

但理想是丰满的,现实总是刺骨的

不搜不知道,一搜才发现关于pyqt5的资料是真的少,不是说没有,而是大部分都是讲述基础部分,进阶的,额,也就那样,难道都没人有进度条随意点动的需求么,还是说用python做GUI的不多。

好吧,无奈,我只能从pyqt5的老父亲Qt的身上寻找答案了

结果千辛万苦搜到了了几条结果,结果如下:

1
2
3
4
5
6
7
8
9
10
11
12
void mousePressEvent(QMouseEvent *ev)
{
//注意应先调用父类的鼠标点击处理事件,这样可以不影响拖动的情况
QSlider::mousePressEvent(ev);
//获取鼠标的位置,这里并不能直接从ev中取值(因为如果是拖动的话,鼠标开始点击的位置没有意义了)
double pos = ev->pos().x() / (double)width();
setValue(pos * (maximum() - minimum()) + minimum());
//向父窗口发送自定义事件event type,这样就可以在父窗口中捕获这个事件进行处理
QEvent evEvent(static_cast<QEvent::Type>(QEvent::User + 1));
QCoreApplication::sendEvent(parentWidget(), &evEvent);
}

可以看到大致流程如下:

  • 重写QSlider.mousePressEvent(鼠标单击事件)
  • 调用父类的鼠标单击处理事件(这里是必须的,因为滑动条的拖动也是一个鼠标单击事件,这样滑动条原有的滑动功能就没有了)
  • 获取鼠标单击的位置,计算鼠标位置在进度条上的比值
  • 进度条当前值=比值*进度条总值

这下就好办了,转python

1
2
3
4
5
6
def mousePressEvent(self, event):
if event.button() == Qt.LeftButton:
super().mousePressEvent(event) # 调用父级的单击事件,听说这样能不影响进度条原来的拖动
val_por = event.pos().x() / self.width() # 获取鼠标在进度条的相对位置
self.setValue(int(val_por * self.maximum())) # 改变进度条的值
# self.cliecked.emit(self.value()) # 点击发送信号,这里可不要

注:C++中所指的父类千万别照搬下来也写成QSlider.mousePressEvent(event),也不要以为父类指的是self.parent(),这两种都是错误的,别问我为什么,说多了都是泪