Qt自定义带游标的slider,在滑块正上方显示当前值(类似于进度条,用一个额外的QLabel冒充QSilder的一部分,然后move就行了)

首先自定义QSlider的子类MyCustomSlider,如下所示。

mycustomslider.h

[cpp] view plain copy
 
 在CODE上查看代码片派生到我的代码片
  1. #ifndef MYCUSTOMSLIDER_H  
  2. #define MYCUSTOMSLIDER_H  
  3. #include <QSlider>  
  4. #include <QLabel>  
  5. #include <QMouseEvent>  
  6. class MyCustomSlider : public QSlider  
  7. {  
  8. public:  
  9.     MyCustomSlider(QWidget *parent=0);  
  10.     ~MyCustomSlider();  
  11.   
  12. protected:  
  13.     virtual void mousePressEvent(QMouseEvent *event);  
  14.     virtual void mouseReleaseEvent(QMouseEvent *event);  
  15.     virtual void mouseMoveEvent(QMouseEvent *event);  
  16.   
  17. private:  
  18.     QLabel* m_displayLabel;  
  19. };  
  20.   
  21. #endif // MYCUSTOMSLIDER_H  

mycustomslider.cpp

[cpp] view plain copy
 
 在CODE上查看代码片派生到我的代码片
  1. #include "mycustomslider.h"  
  2. #include <QPalette>  
  3.   
  4. MyCustomSlider::MyCustomSlider(QWidget *parent):QSlider(parent)  
  5. {  
  6.    m_displayLabel=new QLabel(this);  
  7.    m_displayLabel->setFixedSize(QSize(20,20));  
  8.    //设置游标背景为白色  
  9.    m_displayLabel->setAutoFillBackground(true);  
  10.    QPalette palette;  
  11.    palette.setColor(QPalette::Background, Qt::white);  
  12.    m_displayLabel->setPalette(palette);  
  13.   
  14.    m_displayLabel->setAlignment(Qt::AlignCenter);  
  15.   
  16.    m_displayLabel->setVisible(false);  
  17.    m_displayLabel->move(0,3);  
  18. }  
  19.   
  20. MyCustomSlider::~MyCustomSlider()  
  21. {  
  22.   
  23. }  
  24.   
  25. void MyCustomSlider::mousePressEvent(QMouseEvent *event)  
  26. {  
  27.     if(!m_displayLabel->isVisible())  
  28.     {  
  29.         m_displayLabel->setVisible(true);  
  30.         m_displayLabel->setText(QString::number(this->value()));  
  31.     }  
  32.     QSlider::mousePressEvent(event);  
  33. }  
  34.   
  35. void MyCustomSlider::mouseReleaseEvent(QMouseEvent *event)  
  36. {  
  37.     if(m_displayLabel->isVisible())  
  38.     {  
  39.         m_displayLabel->setVisible(false);  
  40.     }  
  41.     QSlider::mouseReleaseEvent(event);  
  42. }  
  43.   
  44. void MyCustomSlider::mouseMoveEvent(QMouseEvent *event)  
  45. {  
  46.     m_displayLabel->setText(QString::number(this->value()));  
  47.     m_displayLabel->move((this->width()-m_displayLabel->width())*this->value()/(this->maximum()-this->minimum()),3);  
  48.     QSlider::mouseMoveEvent(event);  
  49. }  

然后将界面QSlider控件提升为MyCustomSlider,提升方法如下所示。

Qt中控件类的提升

最后的效果如下图所示,当鼠标点击滑块或者拖动滑块时,滑块正上方的游标实时显示当前值,松开鼠标时,游标隐藏。




源码链接:见http://blog.csdn.net/caoshangpa/article/details/51973902的评论

http://blog.csdn.net/caoshangpa/article/details/51973902

原文地址:https://www.cnblogs.com/findumars/p/5794216.html