Qt滑動條設計與實現


沒有找到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 }
TrackBarCallBack.cpp

 

滑動條類:

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;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM