日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Qt之画刻度尺入门

發布時間:2023/12/18 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Qt之画刻度尺入门 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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);//顯示當前值labelvalueLabel = 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");//temppath為圖片的路徑result = image.scaled(handleLabel->width(), handleLabel->height(),Qt::IgnoreAspectRatio, Qt::SmoothTransformation);//放縮圖片,以固定大小顯示handleLabel->setPixmap(QPixmap::fromImage(result));//在Label控件上顯示圖片}RulerSlider::~RulerSlider(){}/*** 繪制* @brief RulerSlider::paintEvent*/void RulerSlider::paintEvent(QPaintEvent *){QPainter painter;painter.begin(this);//抗鋸齒painter.setRenderHint(QPainter::Antialiasing);drawRulerBackgroud(&painter);drawSliderMark(&painter);painter.end();}/*** 繪制尺子背景* @brief RulerSlider::drawRulerBackgroud* @param painter*/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));}/*** 繪制刻度與值* @brief RulerSlider::drawSliderMark* @param painter*/void RulerSlider::drawSliderMark(QPainter *painter){painter->setPen(Qt::gray);painter->setBrush(QColor(128,128,128));//計算刻度之間的間隔最小為10int dis = maximum()-minimum();//繪制橫坐標開始起點qreal startX = SIDEDISTANCE;// for (uint16_t i=minimum();i<=(minimum()+dis/singleStep());i++) {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;}}/*** 根據鼠標位置獲取當前值* @brief RulerSlider::eventPosGetValue* @param ev*/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);}}/*** 設置slider范圍* @brief RulerSlider::setRulerSliderRange* @param min* @param max*/void RulerSlider::setRulerSliderRange(int min, int max){//當設置的最小值為負數或0時,設置最小值為0int 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();}/*** 設置當前值* @brief RulerSlider::setRulerSliderValue* @param value*/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);}/*** 鼠標移動事件* 當mouseIsClick為true時拖動false懸停* @brief RulerSlider::mouseFilterEvent* @param event*/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();}}}}/*** 事件過濾* @brief RulerSlider::eventFilter* @param watched* @param event* @return*/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 // RULERSLIDER_H

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,"軟件架構構想","本軟件的設計靈感來源于手機端尺子,此軟件的開發,將徹底改變用傳統實體尺子測量,繼而使用電子版測量,永不壞掉,永不丟掉,一次開發,一勞永逸!2020.08.22 Design By Johnson"); }

總結

以上是生活随笔為你收集整理的Qt之画刻度尺入门的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。