沒有找到Qt的滑動條控件,所以自己寫了一個,能夠實現亮度調節、音量調節等功能。
效果如下圖:

主要設計思路:
有些調節功能如對比度是有負值的,所以需要能對滑動條的數值范圍進行設置,不局限於0~100
鼠標拖動時滑動塊能隨着鼠標移動,右側的數字也跟着變化
鼠標釋放時認為對數值設置成功,觸發某個操作
代碼思路:
整個窗口繼承QWdiget,畫一條橫線,滑塊也是畫出的粗線
數值設置成功后的動作使用回調函數,設計一個回調基類,當數值設置成功后,調用回調基類的回調函數。
重寫鼠標單擊、移動、釋放的事件響應函數,當鼠標按下時,設置變量mousedown為true,當鼠標移動時,判斷mousedown是否為true,如果是true,則更新滑塊的坐標信息,然后出發窗口的重繪。
鼠標釋放時設置mousedown為false,與鼠標滑動一樣,更新滑塊的坐標信息,觸發窗口重繪,然后調用回調函數完成對數值的設置。
具體代碼:
回調基類:
1 #ifndef TRACKBARCALLBACK_H 2 #define TRACKBARCALLBACK_H 3 4 class TrackBarCallBack 5 { 6 public: 7 TrackBarCallBack(); 8 virtual void callBack(int value); 9 }; 10 11 #endif // TRACKBARCALLBACK_H
1 #include "trackbarcallback.h" 2 3 TrackBarCallBack::TrackBarCallBack() 4 { 5 } 6 7 void TrackBarCallBack::callBack(int value) 8 { 9 }
滑動條類:
trackbar.h
1 #ifndef TRACKBAR_H 2 #define TRACKBAR_H 3 #include <QWidget> 4 #include "trackbarcallback.h" 5 6 class TrackBar: public QWidget 7 { 8 public: 9 TrackBar(TrackBarCallBack *callBack, int width=390, int height=40, int start=0, int end=100); 10 void setPosition(int position); 11 void mouseReleaseEvent(QMouseEvent *); 12 void paintEvent(QPaintEvent *); 13 void mousePressEvent(QMouseEvent *); 14 void mouseMoveEvent(QMouseEvent *); 15 private: 16 TrackBarCallBack *callBack; 17 int start;//數值范圍起點 18 int end;//數值范圍終點 19 int position; 20 bool mousedown; 21 int widthOfLine;//橫線的長度 22 }; 23 24 #endif // TRACKBAR_H
trackbar.cpp
1 #include "trackbar.h" 2 #include <QWidget> 3 #include <QPainter> 4 #include <QMouseEvent> 5 6 TrackBar::TrackBar(TrackBarCallBack *callBack, int width, int height, int start, int end):QWidget() 7 { 8 this->callBack=callBack; 9 this->start = start; 10 this->end = end; 11 this->setMinimumSize(width,height); 12 this->setMaximumSize(width,height); 13 this->position = end;//豎線的位置,標識亮度的數值 14 this->mousedown = false;//為了實現拖動效果,先判斷是否點下了鼠標,然后鼠標移動才有效 15 } 16 17 void TrackBar:: mouseReleaseEvent(QMouseEvent *event){ 18 this->mousedown=false;//鼠標放下后,鼠標移動不再具有拖動效果 19 int pos=event->x(); 20 if(pos<5)//減5是因為顯示的時候為了好看左邊從5的位置開始顯示,當作刻度0 21 position = start; 22 else if(pos>(widthOfLine+5)) 23 position = end; 24 else{ 25 double ratio = 1.0 * (pos - 5) / widthOfLine; 26 position = (end - start) * ratio + start; 27 } 28 update();//觸發重繪操作,生成paintEvent事件 29 30 callBack->callBack(position);//回調函數 31 } 32 33 34 void TrackBar::paintEvent(QPaintEvent *){ 35 QPainter p(this); 36 p.setPen(QPen(Qt::lightGray, 5));//寫字用的這個字體,先用這個字體獲取字的像素大小 37 int widthOfTitle = 5 + 1.2 * p.fontMetrics().width(QString::number(-end));//最右顯示數字需要的大小,加負號防止出現負數(-100~100) 38 int w =width() - widthOfTitle; 39 widthOfLine = w -5; 40 p.setPen(Qt::lightGray); 41 p.drawLine(QPoint(5,height()/2),QPoint(w,height()/2));//中間的橫線 42 p.setPen(QPen(Qt::lightGray, 5)); 43 double ratio = 1.0 * (position - start)/(end - start); 44 if(ratio < 0){ 45 ratio = -ratio; 46 } 47 int posX = (w - 5) * ratio + 5; 48 p.drawLine(QPoint(posX,10),QPoint(posX,height()-10));//豎線,標識亮度數值的位置 49 int heightOfTitle = p.fontMetrics().height(); 50 p.drawText(w+5,height()/2 + heightOfTitle/2,QString::number(position));//寫文字的y坐標是文字的底部坐標 51 } 52 53 void TrackBar:: mousePressEvent(QMouseEvent *){ 54 this->mousedown=true;//鼠標按下,之后鼠標移動操作產生拖動效果 55 } 56 57 void TrackBar::mouseMoveEvent(QMouseEvent *event){//鼠標移動事件,是否是拖動需要判斷是否鼠標按下了 58 if(mousedown==false) 59 return; 60 //下面的跟鼠標釋放操作是一樣的 61 int pos=event->x(); 62 if(pos<5)//減5是因為顯示的時候為了好看左邊從5的位置開始顯示,當作刻度0 63 position = start; 64 else if(pos>(widthOfLine+5)) 65 position = end; 66 else{ 67 double ratio = 1.0 * (pos - 5) / widthOfLine; 68 position = (end - start) * ratio + start; 69 } 70 update();//觸發重繪操作,生成paintEvent事件 71 } 72 73 void TrackBar::setPosition(int position){ 74 this->position = position; 75 }
使用滑動條&測試
1 #ifndef MAINWINDOW_H 2 #define MAINWINDOW_H 3 4 #include <QMainWindow> 5 #include "trackbarcallback.h" 6 #include "trackbar.h" 7 8 namespace Ui { 9 class MainWindow; 10 } 11 12 class MainWindow : public QMainWindow,public TrackBarCallBack 13 { 14 Q_OBJECT 15 16 public: 17 explicit MainWindow(QWidget *parent = 0); 18 void callBack(int value); 19 ~MainWindow(); 20 21 private: 22 Ui::MainWindow *ui; 23 TrackBar *trackBar; 24 }; 25 26 #endif // MAINWINDOW_H
#include "mainwindow.h" #include "ui_mainwindow.h" #include <qdebug.h> MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); trackBar = new TrackBar(this,400,40,-100,100); trackBar->setWindowTitle(QString("正負數值設置")); trackBar->show(); } MainWindow::~MainWindow() { delete ui; } void MainWindow::callBack(int value){ qDebug()<<"value:"<<value; }


