当前位置:   article > 正文

Qt --- 重写QSlider,实现鼠标控制QSlider滑块_qslider tracking()

qslider tracking()

最近的项目需要利用QSlider水平进度条,实现鼠标控制音乐播放的进度。但是QSlider 本身没有抛出捕捉鼠标事件,获取鼠标的x方向位置信息的信号,所以为了实现功能,我们需要对QSlider重写自定义类。

QSlider类所抛出的信号:

valueChanged():当滑块的值发生了改变,发射此信号。tracking()确定在用户交互时,是否发出此信号。
sliderPressed():当用户按下滑块,发射此信号。
sliderMoved():当用户拖动滑块,发射此信号。
sliderReleased():当用户释放滑块,发射此信号。

 

重写QSlider类:

1. 新建MySlider 自定义Qt类,继承自QSlider。

 

2. 头文件myslider.h

  1. #ifndef MYSLIDER_H
  2. #define MYSLIDER_H
  3. #include <QWidget>
  4. #include <QMouseEvent>
  5. #include <QSlider>
  6. class MySlider : public QSlider
  7. {
  8. Q_OBJECT
  9. public:
  10. MySlider(QWidget *parent = 0);
  11. ~MySlider();
  12. Q_SIGNALS:
  13. void sliderReleasedAt(int);//当鼠标释放时,抛出包含鼠标X坐标位置信息的信号
  14. public Q_SLOTS:
  15. //void setValue(int value);
  16. protected: //mouse
  17. void mousePressEvent(QMouseEvent *event); //单击
  18. void mouseMoveEvent(QMouseEvent *event);
  19. void mouseReleaseEvent(QMouseEvent *event) ;
  20. // virtual bool event(QEvent *event) override;
  21. bool m_isMoving;
  22. int m_value;
  23. bool m_mousePress;
  24. };
  25. #endif // MYSLIDER_H

3. CPP文件重写方法myslider.cpp

  1. #include "myslider.h"
  2. #include "ui_myslider.h"
  3. #include <QDebug>
  4. #include <QEvent>
  5. MySlider::MySlider(QWidget *parent):QSlider(parent){
  6. m_value=0;
  7. m_mousePress = false;
  8. m_isMoving=false;
  9. }
  10. MySlider::~MySlider()
  11. {
  12. }
  13. void MySlider::mousePressEvent(QMouseEvent *event){
  14. // this.x:控件原点到界面边缘的x轴距离;
  15. // globalPos.x:鼠标点击位置到屏幕边缘的x轴距离;
  16. // pos.x:鼠标点击位置到本控件边缘的距离;
  17. // this.width:本控件的宽度;
  18. //注意应先调用父类的鼠标点击处理事件,这样可以不影响拖动的情况
  19. QSlider::mousePressEvent(event);
  20. m_isMoving = false;
  21. m_mousePress = true;
  22. //获取鼠标的位置,这里并不能直接从ev中取值(因为如果是拖动的话,鼠标开始点击的位置没有意义了)
  23. double pos = event->pos().x() / (double)width();
  24. double value = pos * (maximum() - minimum()) + minimum();
  25. //value + 0.5 四舍五入
  26. if(value>maximum()){
  27. value=maximum();
  28. }
  29. if(value<minimum()){
  30. value=minimum();
  31. }
  32. m_value=value+0.5;
  33. setValue(m_value);
  34. //emit sliderMoved( m_value );
  35. //向父窗口发送自定义事件event type,这样就可以在父窗口中捕获这个事件进行处理
  36. QEvent evEvent(static_cast<QEvent::Type>(QEvent::User + 1));
  37. QCoreApplication::sendEvent(parentWidget(), &evEvent);
  38. }
  39. void MySlider::mouseMoveEvent(QMouseEvent *event){
  40. QSlider::mouseMoveEvent(event);
  41. //qDebug()<<"mouseMoveEvent";
  42. double pos = event->pos().x() / (double)width();
  43. double value = pos * (maximum() - minimum()) + minimum();
  44. if(value>maximum()){
  45. value=maximum();
  46. }
  47. if(value<minimum()){
  48. value=minimum();
  49. }
  50. //value + 0.5 四舍五入
  51. if(m_mousePress){
  52. m_value=value + 0.5;
  53. m_isMoving=true;
  54. //emit sliderMoved(m_value);
  55. }
  56. setValue(value + 0.5);
  57. //向父窗口发送自定义事件event type,这样就可以在父窗口中捕获这个事件进行处理
  58. QEvent evEvent(static_cast<QEvent::Type>(QEvent::User + 1));
  59. QCoreApplication::sendEvent(parentWidget(), &evEvent);
  60. }
  61. void MySlider::mouseReleaseEvent(QMouseEvent *event){
  62. QSlider::mouseReleaseEvent(event);
  63. //qDebug()<<"mouseReleaseEvent"<<m_value;
  64. m_mousePress = false;
  65. m_isMoving=false;
  66. emit sliderReleasedAt(m_value);//抛出有用信号
  67. }

4. myslider.ui自己设计一下

5. 将主UI界面中QSlider控件提升为MySlider类

提升的类名称中输入自定义的myslider类,之后“添加”按钮使能,点击添加按钮,最后勾选myslider.h,即可。

 

6. 主线程中,MySlider的信号sliderReleasedAt(int)连接this的slot槽函数,进行相应的操作:音乐进度改变。

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/510604
推荐阅读
相关标签
  

闽ICP备14008679号