生活随笔
收集整理的這篇文章主要介紹了
Qt之画刻度尺入门
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
Qt之畫刻度尺入門
效果圖
上源碼
#include "rulerslider.h"
#include "QPainter"
#include "math.h"#include <QDebug>
#include <QEvent>
#include <QMouseEvent>RulerSlider
::RulerSlider(QWidget
*parent
):QSlider(parent
){installEventFilter(this);setMouseTracking(true);valueLabel
= new QLabel(this);valueLabel
->setStyleSheet("background-color: rgb(0, 0, 0);font-size:14px;color:white;border:1px solid black");valueLabel
->setAlignment(Qt
::AlignCenter
);valueLabel
->hide();handleLabel
= new QLabel(this);handleLabel
->setFixedSize(20,15);handleLabel
->raise();QImage image
,result
;image
.load(":/images/handle.png");result
= image
.scaled(handleLabel
->width(), handleLabel
->height(),Qt
::IgnoreAspectRatio
, Qt
::SmoothTransformation
);handleLabel
->setPixmap(QPixmap
::fromImage(result
));}RulerSlider
::~RulerSlider(){}void RulerSlider
::paintEvent(QPaintEvent
*){QPainter painter
;painter
.begin(this);painter
.setRenderHint(QPainter
::Antialiasing
);drawRulerBackgroud(&painter
);drawSliderMark(&painter
);painter
.end();}void RulerSlider
::drawRulerBackgroud(QPainter
*painter
){QPointF
topLeftPot3(0,0);QPointF
bottomRightPot3(width(),height());painter
->setPen(Qt
::white
);painter
->setBrush(QColor(61,84,110));painter
->drawRect(QRectF(topLeftPot3
,bottomRightPot3
));}void RulerSlider
::drawSliderMark(QPainter
*painter
){painter
->setPen(Qt
::gray
);painter
->setBrush(QColor(128,128,128));int dis
= maximum()-minimum();qreal startX
= SIDEDISTANCE
;for (uint16_t i
=minimum();i
<=1000;i
++) {if(i
%2 == 0 && i
%5 == 0){painter
->drawRect(QRectF(startX
,0,0.1,BIG_Y
));float value
= round(minimum()+((i
-minimum())*singleStep()));QString strValue
= tr("%1").arg(value
);int fontWidth
= fontMetrics().width(strValue
)/2;painter
->drawText(QPointF(startX
-fontWidth
,BIG_Y
+15),strValue
);}else {if(i
%5 == 0){painter
->drawRect(QRectF(startX
,0,0.1,MIDDLE_Y
));}else{painter
->drawRect(QRectF(startX
,0,0.1,SMALL_Y
));}}startX
+=sliderInterval
;}}void RulerSlider
::eventPosGetValue(QMouseEvent
*ev
){double posWidth
= (double)width()-SIDEDISTANCER
-SIDEDISTANCE
;double xpos
= ev
->pos().x();if(xpos
>=SIDEDISTANCE
&&xpos
<=width()-SIDEDISTANCER
){double posValue
= (xpos
-SIDEDISTANCE
)/posWidth
;int value
=round(posValue
* (maximum()-minimum()) + minimum());handleLabel
->move(xpos
-handleLabel
->width()/2,0);qDebug()<<"結果值"<<value
;setValue(value
);}}void RulerSlider
::setRulerSliderRange(int min
, int max
){int minNum
= min
;int maxNum
= max
;if(min
<=0){minNum
= 0;}if(max
-min
<= DIFFERVALUE
){maxNum
= min
+DIFFERVALUE
;}qDebug()<<"滑動條"<<value()<<minNum
<<maxNum
;setMaximum(maxNum
);setMinimum(minNum
);if(value()>minNum
){int dis
= maxNum
-minNum
;sliderInterval
= (float)(width()-SIDEDISTANCE
-SIDEDISTANCER
)/(dis
/singleStep());double pos
= ((value()-minNum
)/singleStep())*sliderInterval
+SIDEDISTANCE
;handleLabel
->move(pos
-handleLabel
->width()/2,0);}else {handleLabel
->move(SIDEDISTANCE
-handleLabel
->width()/2,0);}update();}void RulerSlider
::setRulerSliderValue(int value
){int dis
= maximum()-minimum();sliderInterval
= (float)(width()-SIDEDISTANCE
-SIDEDISTANCER
)/(dis
/singleStep());double pos
= ((value
-minimum())/singleStep())*sliderInterval
+SIDEDISTANCE
;handleLabel
->move(pos
-handleLabel
->width()/2,0);setValue(value
);}void RulerSlider
::mouseFilterEvent(QMouseEvent
*event
){double xpos
= event
->pos().x();if(xpos
>=SIDEDISTANCE
&&xpos
<=width()-SIDEDISTANCER
){if(mouseIsClick
){handleLabel
->move(xpos
-handleLabel
->width()/2,0);if(valueLabel
->isVisible()){valueLabel
->hide();}}else {double posWidth
= (double)width()-SIDEDISTANCER
-SIDEDISTANCE
;double posValue
= (xpos
-SIDEDISTANCE
)/posWidth
;int value
=round(posValue
* (maximum()-minimum()) + minimum());if(valueLabel
->isHidden()){valueLabel
->show();}if(value
>= minimum() && value
<= maximum()){valueLabel
->setText(QString
::number(value
));valueLabel
->adjustSize();valueLabel
->move(xpos
+DISTANCEMOUSE
,height()-valueLabel
->height());valueLabel
->raise();}}}}bool RulerSlider
::eventFilter(QObject
*watched
, QEvent
*event
){QMouseEvent
*mouseEvent
= static_cast<QMouseEvent
*>(event
);if(QEvent
::HoverLeave
== event
->type()&&!valueLabel
->isHidden()){valueLabel
->hide();}if(QEvent
::HoverMove
== event
->type()){mouseFilterEvent(mouseEvent
);}if(QEvent
::MouseButtonPress
== event
->type()){if(mouseEvent
->button() & Qt
::LeftButton
){mouseIsClick
= true;}}if(QEvent
::MouseButtonRelease
== event
->type()){QSlider
::mouseReleaseEvent(mouseEvent
);eventPosGetValue(mouseEvent
);mouseIsClick
= false;}return QSlider
::eventFilter(watched
,event
);}
.h文件
#ifndef RULERSLIDER_H
#define RULERSLIDER_H#define SMALL_Y 5
#define MIDDLE_Y 7
#define BIG_Y 10
#define DIFFERVALUE 1
#define SIDEDISTANCE 10
#define SIDEDISTANCER 50
#define HANDLEWIDTH 10
#define HANDLEHEIGHT 15
#define MININTERVSL 10
#define MAXINTERVSL 20
#define DISTANCEMOUSE 20
#include <QSlider>
#include <QLabel>class RulerSlider : public QSlider
{public:RulerSlider(QWidget
*parent
= nullptr);~RulerSlider();qreal sliderInterval
= 1;QLabel
*valueLabel
;QLabel
*handleLabel
;bool mouseIsClick
= false;void setRulerSliderRange(int min
,int max
);void setRulerSliderValue(int value
);private:void drawRulerBackgroud(QPainter
*painter
);void drawSliderMark(QPainter
*painter
);void eventPosGetValue(QMouseEvent
*ev
);void mouseFilterEvent(QMouseEvent
*event
);protected:void paintEvent(QPaintEvent
*);bool eventFilter(QObject
*watched
,QEvent
*event
);};#endif
widget.cpp文件的
#include "widget.h"
#include "ui_widget.h"
#include "rulerslider.h"
#include <QMessageBox>Widget
::Widget(QWidget
*parent
): QWidget(parent
), ui(new Ui
::Widget
)
{ui
->setupUi(this);this->setWindowTitle("Ruler Measurement Tools 2020.08.22 Design By Johnson");RulerSlider
*slider
= new RulerSlider(this);slider
->setFixedSize(this->width(),300);slider
->setSingleStep(1);slider
->setRulerSliderRange(0,280);slider
->setRulerSliderValue(50);QObject
::connect(slider
,SIGNAL(valueChanged(int)),this,SLOT(sliderValueChanged(int)));}Widget
::~Widget()
{delete ui
;
}void Widget
::on_pushButton_clicked()
{QMessageBox
::aboutQt(this,"about");
}void Widget
::on_pushButton_2_clicked()
{QMessageBox
::warning(this,"軟件架構構想","本軟件的設計靈感來源于手機端尺子,此軟件的開發(fā),將徹底改變用傳統(tǒng)實體尺子測量,繼而使用電子版測量,永不壞掉,永不丟掉,一次開發(fā),一勞永逸!2020.08.22 Design By Johnson");
}
總結
以上是生活随笔為你收集整理的Qt之画刻度尺入门的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。