欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Qt自定義控件實現(xiàn)多彩色儀表盤

 更新時間:2019年12月19日 16:46:44   作者:parkchorong  
這篇文章主要為大家詳細介紹了Qt自定義控件實現(xiàn)多彩色儀表盤,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

本文實例為大家分享了Qt實現(xiàn)多彩色儀表盤的具體代碼,供大家參考,具體內容如下

Qt自定義控件4:多彩色儀表盤

先看效果圖:

思路:外圍三色的圓弧 紅:藍:綠 = 1:2:1,總共占270度??潭染€是根據(jù)所在圓弧的顏色而畫,刻度線的角度也是根據(jù)坐標系的旋轉而畫??潭戎凳歉鶕?jù)刻度線的角度得到所要畫的刻度的左上角的坐標,然后構成一個矩形,根據(jù)矩形畫出刻度值。指針是根據(jù)四個點的坐標直接畫的四邊形,再旋轉坐標系實現(xiàn)指針旋轉的效果。下方的文字直接得到坐標橫縱坐標位置得到矩形畫出value的值

關鍵代碼:CMPassrate3.cpp

void CMPassrate3::paintEvent(QPaintEvent *event){
  int width = this->width();
  int height = this->height();
  int side = qMin(width, height);

  QPainter painter(this);
  painter.setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing);
  painter.translate(width / 2, height / 2);
  painter.scale(side / 200.0, side / 200.0);
  drawBG(&painter);
  drawE(&painter);
  drawLine(&painter);
  drawText(&painter);
  drawBootomText(&painter);
  drawPoint(&painter);
}

void CMPassrate3::drawE(QPainter* painter){
  painter->setPen(Qt::NoPen);
  QRect rectOut(-outRadius,-outRadius,2*outRadius,2*outRadius);
  QRect rectInn(-innRadius,-innRadius,2*innRadius,2*innRadius);
  painter->save();
  painter->setBrush(QColor("#04EEB2"));
  QPainterPath path;
  path.arcTo(rectOut,-45,270.0/4);

  QPainterPath subPath;
  subPath.addEllipse(rectInn);
  path -= subPath;
  painter->drawPath(path);
  painter->restore();

  painter->save();
  QPainterPath bluePath;
  QPainterPath blueSubPath;
  painter->setBrush(QColor("#2DC5F6"));
  bluePath.arcTo(rectOut,-45+(270.0/4),270.0/2);

  blueSubPath.addEllipse(rectInn);
  bluePath -= blueSubPath;
  painter->drawPath(bluePath);
  painter->restore();

  painter->save();
  QPainterPath redPath;
  QPainterPath redSubPath;
  painter->setBrush(QColor("#FA468C"));
  redPath.arcTo(rectOut,-45+270.0*3/4,270.0/4);

  redSubPath.addEllipse(rectInn);
  redPath -= redSubPath;
  painter->drawPath(redPath);
  painter->restore();
}

void CMPassrate3::drawLine(QPainter* painter){
  painter->save();
  painter->rotate(135);
  //270/8度一格
  for(int i = 0;i<9;i++){
    if(i<3){
      painter->setPen(QColor("#FA468C"));
    }else if(i<6){
      painter->setPen(QColor("#2DC5F6"));
    }else{
      painter->setPen(QColor("#04EEB2"));
    }
    QLine line(QPoint(lineStart,0),QPoint(innRadius,0));
    painter->drawLine(line);
    painter->rotate(270.0/8);
  }
  painter->restore();
}

void CMPassrate3::drawPoint(QPainter* painter){
  const QPoint point[4]{
    QPoint(0,0),QPoint(0,6),QPoint((lineStart-3)*qCos(135*3.14/180),(lineStart-3)*qSin(135*3.14/180)),QPoint(-6,0)
  };
  float range = 270.0/100*value;
  painter->save();
  painter->setBrush(QColor("#C2E481"));
  painter->rotate(range);
  painter->drawConvexPolygon(point,4);
  painter->restore();
}

void CMPassrate3::drawBG(QPainter* painter){//可以自行添加背景圖片實現(xiàn)更加精美的效果
//  painter->save();
//  QImage image(":/image/images/bg1.jpg");
//  QRect rect(-this->width(),-this->height(),this->width()*2,this->height()*2);
//  painter->drawImage(rect,image);
//  painter->restore();

}

void CMPassrate3::drawText(QPainter *painter){
  painter->save();
  //初始為
  painter->setPen(Qt::black);
  QFont font = painter->font();
  font.setPixelSize(8);
  painter->setFont(font);
  float x,y;
  for(float i =0;i<=100;i+=12.5){
    x = lineStart*qCos((135+(270.0/8)*((i+1)/12.5))*3.14/180);
    y = lineStart*qSin((135+(270.0/8)*((i+1)/12.5))*3.14/180);
    QRect rect;
    if(i<50){
      rect.setX(x);
      rect.setY(y);
    }else if(i>50){
      rect.setX(x-17);
      rect.setY(y-7);
    }else{
      rect.setX(x);
      rect.setY(y);
    }
    rect.setWidth(17);
    rect.setHeight(10);
    painter->drawText(rect,Qt::AlignCenter,QString::number(i));
  }


  painter->restore();
}

void CMPassrate3::drawBootomText(QPainter *painter){
  painter->save();
  painter->setPen(Qt::black);
  QFont font = painter->font();
  font.setPixelSize(25);
  painter->setFont(font);
  painter->translate(0,outRadius-12);
  int length = 20;
  QRect rect(-length,-length,length*2,length*2);
  painter->drawText(rect,Qt::AlignCenter,QString::number(value));
  painter->restore();
}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • C語言判斷字符是否為可打印字符的方法

    C語言判斷字符是否為可打印字符的方法

    這篇文章主要介紹了C語言判斷字符是否為可打印字符的方法,分別為isprint()函數(shù)和isgraph()函數(shù)的使用,需要的朋友可以參考下
    2015-08-08
  • C++實現(xiàn)產生隨機數(shù)和相應的猜拳小游戲實例代碼

    C++實現(xiàn)產生隨機數(shù)和相應的猜拳小游戲實例代碼

    C++中沒有自帶的random函數(shù),要實現(xiàn)隨機數(shù)的生成就需要使用rand()和srand()。下面這篇文章主要給大家介紹了關于C++實現(xiàn)產生隨機數(shù)和相應的猜拳小游戲的相關資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下
    2018-09-09
  • C++實現(xiàn)計算器功能

    C++實現(xiàn)計算器功能

    這篇文章主要為大家詳細介紹了C++實現(xiàn)計算器功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • C++實現(xiàn)STL迭代器萃取的示例代碼

    C++實現(xiàn)STL迭代器萃取的示例代碼

    迭代器是一種抽象的設計概念,它提供了一種方法,使之能夠依序巡訪某個聚合物(容器)所含的各個元素,而又無需暴露該聚合物的內部表述方式。本文主要介了STL迭代器萃取的方法,需要的可以參考一下
    2022-11-11
  • 一文帶你了解C++中deque的使用

    一文帶你了解C++中deque的使用

    C++中的deque是一種雙端隊列,可以在隊列的前端和后端進行插入元素和刪除操作,同時可以視作一個長度不定的數(shù)組,支持高效的插入和刪除操作。本篇文章將深入探討C++中的deque的使用,感興趣的可以了解一下
    2023-05-05
  • C語言中設置進程優(yōu)先順序的方法

    C語言中設置進程優(yōu)先順序的方法

    這篇文章主要介紹了C語言中設置進程優(yōu)先順序的方法,包括setpriority()函數(shù)和getpriority()函數(shù)以及nice()函數(shù),需要的朋友可以參考下
    2015-08-08
  • 關于C語言操作符的那些事(超級全)

    關于C語言操作符的那些事(超級全)

    這篇文章主要給大家介紹了關于C語言操作符的那些事兒,c語言的操作符有很多,包括算術操作符、移位操作符、位操作符、賦值操作符、單目操作符、關系操作符、邏輯操作符、條件操作符、逗號表達式、下標引用、函數(shù)調用和結構成員,需要的朋友可以參考下
    2021-08-08
  • C語言函數(shù)語法詳解

    C語言函數(shù)語法詳解

    本文是小結了一下C語言的函數(shù)語法,詳細介紹了C語言函數(shù)語法的概述、函數(shù)的定義、函數(shù)的返回值、函數(shù)調用等7個方面的內容,非常詳細,這里推薦給小伙伴們。
    2015-02-02
  • C++變位詞問題分析

    C++變位詞問題分析

    這篇文章主要介紹了C++變位詞問題分析,非常經典的算法,對于進行C++下的算法設計有很大的啟發(fā)性,需要的朋友可以參考下
    2014-08-08
  • C++教程之變量的作用域與生命周期詳解

    C++教程之變量的作用域與生命周期詳解

    在C++編程中,變量的作用域和生命周期是非常重要的概念。了解這些概念可以幫助開發(fā)人員編寫更好的代碼并避免錯誤。在本文中,我們將探討C++中變量的作用域和生命周期,以及如何正確地使用它們
    2023-04-04

最新評論