精华内容
下载资源
问答
  • QT仪表盘

    千次阅读 2018-08-17 08:42:15
    使用Qt简单谢了一个飞机的一小部分仪表,还没有写完,目前只写了一个界面,不过思想应该是一样的。 效果图如下 其中主要由转速表,和下面的部分数字显示构成 转速表代码 .h文件 ifndef CONTROL_ENGINE_H ...

    使用Qt简单谢了一个飞机的一小部分仪表,还没有写完,目前只写了一个界面,不过思想应该是一样的。

    效果图如下

    其中主要由转速表,和下面的部分数字显示构成

    转速表代码

    .h文件

    ifndef CONTROL_ENGINE_H

    define CONTROL_ENGINE_H

    include

    include

    include

    define PI 3.1415926

    define GREEN 0,255,0

    define YELLOW 211,137,50

    define WHITE 255,255,255

    namespace Ui {
    class Control_Engine;
    }

    class Control_Engine : public QWidget
    {
    Q_OBJECT

    public:
    explicit Control_Engine(QWidget *parent,int temp);
    ~Control_Engine();
    void set_Engine(int temp);
    private:
    bool eventFilter(QObject *temp1, QEvent *temp2);
    void draw_Engine();
    void draw_Percent();
    private:
    Ui::Control_Engine *ui;
    int num_Engine;
    int num_Percent;
    };

    endif // CONTROL_ENGINE_H

    cpp文件

    include “control_engine.h”

    include “ui_control_engine.h”

    include

    Control_Engine::Control_Engine(QWidget *parent,int temp) :
    QWidget(parent),
    ui(new Ui::Control_Engine)
    {
    ui->setupUi(this);
    ui->label_draw->installEventFilter(this);
    ui->label_percent->installEventFilter(this);
    num_Engine = 0;
    num_Percent = 0;

    if(temp == 0)
    {
        ui->label_draw->move(50,0);
        ui->label->move(40,20);
        ui->label_percent->move(0,17);
    }
    else if(temp == 1)
    {
        ui->label_draw->move(0,0);
        ui->label->move(110,20);
        ui->label_percent->move(70,17);
    }
    

    }

    Control_Engine::~Control_Engine()
    {
    delete ui;
    }

    void Control_Engine::set_Engine(int temp)
    {
    num_Engine = temp;
    num_Percent = temp/2;
    update();
    }

    bool Control_Engine::eventFilter(QObject *temp1, QEvent *temp2)
    {
    if((temp1 == ui->label_draw)&&temp2->type() == QEvent::Paint)
    {
    draw_Engine();
    }
    if((temp1 == ui->label_percent)&&temp2->type() == QEvent::Paint)
    {
    draw_Percent();
    }
    }

    void Control_Engine::draw_Engine()
    {

    if(num_Engine<=200)
    {
        QPainter painter1(ui->label_draw);
        painter1.setRenderHint(QPainter::Antialiasing,true);
        painter1.setPen(QPen(QColor(GREEN),3,Qt::SolidLine,Qt::FlatCap));
        painter1.drawArc(13,3,54,54,180*16,270*16);
        painter1.drawLine(3,30,14,30);
        QPainter painter2(ui->label_draw);
        painter2.setRenderHint(QPainter::Antialiasing,true);
        painter2.setPen(QPen(QColor(GREEN),3,Qt::SolidLine,Qt::FlatCap));
        painter2.drawLine(40,30,(40+27*qSin(num_Engine*PI/180.0)),(30-27*qCos(num_Engine*PI/180.0)));
    }
    else
    {
        QPainter painter1(ui->label_draw);
        painter1.setRenderHint(QPainter::Antialiasing,true);
        painter1.setPen(QPen(QColor(YELLOW),3,Qt::SolidLine,Qt::FlatCap));
        painter1.drawArc(13,3,54,54,180*16,270*16);
        painter1.drawLine(3,30,14,30);
        QPainter painter2(ui->label_draw);
        painter2.setRenderHint(QPainter::Antialiasing,true);
        painter2.setPen(QPen(QColor(YELLOW),3,Qt::SolidLine,Qt::FlatCap));
        painter2.drawLine(40,30,(40+27*qSin(num_Engine*PI/180.0)),(30-27*qCos(num_Engine*PI/180.0)));
    }
    

    }

    void Control_Engine::draw_Percent()
    {
    if(num_Percent<=100)
    {
    QPainter painter1(ui->label_percent);
    painter1.setPen(QPen(QColor(WHITE),1.5));
    QRect rect1(1,3,36,20);
    painter1.drawRect(rect1);
    QPainter painter2(ui->label_percent);
    painter2.setPen(QPen(QColor(GREEN),1.5));
    QString str = QString::number(num_Percent,10);
    QFont font(“宋体”,12,QFont::Bold);
    painter2.setFont(font);
    painter2.drawText(rect1,Qt::AlignCenter,str);
    }
    else
    {
    QPainter painter1(ui->label_percent);
    painter1.setPen(QPen(QColor(WHITE),1.5));
    QRect rect1(1,3,36,20);
    painter1.drawRect(rect1);
    QPainter painter2(ui->label_percent);
    painter2.setPen(QPen(QColor(YELLOW),1.5));
    QString str = QString::number(num_Percent,10);
    QFont font(“宋体”,12,QFont::Bold);
    painter2.setFont(font);
    painter2.drawText(rect1,Qt::AlignCenter,str);
    }

    }
    百分比代码

    .h.

    ifndef CONTROL_PERCENT_H

    define CONTROL_PERCENT_H

    include

    include

    define GREEN 0,255,0

    define WHITE 255,255,255

    namespace Ui {
    class Control_Percent;
    }

    class Control_Percent : public QWidget
    {
    Q_OBJECT

    public:
    explicit Control_Percent(QWidget *parent = 0);
    ~Control_Percent();
    void set_Percent(int temp);
    private:
    void draw_Percent();
    bool eventFilter(QObject *temp1, QEvent *temp2);
    private:
    Ui::Control_Percent *ui;
    int num_Percent;
    };

    endif // CONTROL_PERCENT_H

    cpp

    include “control_percent.h”

    include “ui_control_percent.h”

    Control_Percent::Control_Percent(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Control_Percent)
    {
    ui->setupUi(this);
    num_Percent = 0;
    ui->label_percent->installEventFilter(this);
    }

    Control_Percent::~Control_Percent()
    {
    delete ui;
    }

    void Control_Percent::set_Percent(int temp)
    {
    num_Percent = temp;
    }

    void Control_Percent::draw_Percent()
    {
    QPainter painter1(ui->label_percent);
    painter1.setPen(QPen(QColor(WHITE),1.5));
    QRect rect1(1,3,36,20);
    painter1.drawRect(rect1);
    QPainter painter2(ui->label_percent);
    painter2.setPen(QPen(QColor(GREEN),1.5));
    QString str = QString::number(num_Percent,10);
    QFont font(“宋体”,12,QFont::Bold);
    painter2.setFont(font);
    painter2.drawText(rect1,Qt::AlignCenter,str);
    }

    bool Control_Percent::eventFilter(QObject *temp1, QEvent *temp2)
    {
    if((temp1 == ui->label_percent)&&temp2->type() == QEvent::Paint)
    {
    draw_Percent();
    }
    }

    剩下的其它小部分代码

    界面初始化部分代码

    void MainWidget::set_Form_down(int temp)
    {
    switch (temp) {
    case 0:
    {
    if(ui->widget_Form_Down->isHidden())
    {
    ui->widget_Form_Down->show();
    }
    else
    {
    ui->label_Form_Down_Plane->setStyleSheet(“border-image:url(:/Form_Down/Source/Form_Down/F22.png)”);
    if(engine_left == NULL)
    {
    engine_left = new Control_Engine(ui->widget_Form_Down,LEFT);
    engine_left->setGeometry(17,20,120,80);
    }
    if(engine_right == NULL)
    {
    engine_right = new Control_Engine(ui->widget_Form_Down,RIGHT);
    engine_right->setGeometry(180,20,120,80);
    }

            //            QPalette palette;
            //            palette.setColor(QPalette::WindowText,Qt::red);
            //            ui->label_ENG->setPalette(palette);
            //            QFont font;
            //            font.setPointSize(12);
            //            ui->label_ENG->setFont(font);
            //            ui->label_ENG->setText("TEST");
            //            ui->label_ENG->setAlignment(Qt::AlignCenter);
            if(percent1 == NULL)
            {
                percent1 = new Control_Percent(ui->widget_Form_Down);
                percent1->setGeometry(30,170,50,26);
                percent1->set_Percent(50);                      //test
            }
            if(percent2 == NULL)
            {
                percent2 = new Control_Percent(ui->widget_Form_Down);
                percent2->setGeometry(245,170,50,26);
                percent2->set_Percent(50);                      //test
            }
            if(percent3 == NULL)
            {
                percent3 = new Control_Percent(ui->widget_Form_Down);
                percent3->setGeometry(30,240,50,26);
                percent3->set_Percent(50);                      //test
            }
            if(percent4 == NULL)
            {
                percent4 = new Control_Percent(ui->widget_Form_Down);
                percent4->setGeometry(245,240,50,26);
                percent4->set_Percent(50);                      //test
            }
        }
    
    
    
        break;
    }
    case 1:
        ui->widget_Form_Down->hide();
        break;
    default:
        break;
    }
    

    }
    绘制其它部分代码
    void MainWidget::draw_Gun()
    {
    QPainter painter1(ui->label_GUN);
    painter1.setPen(QPen(QColor(WHITE),1.5));
    QRect rect1(1,3,76,22);
    painter1.drawRect(rect1);
    QPainter painter2(ui->label_GUN);
    painter2.setPen(QPen(QColor(GREEN),1.5));
    QString str = “GUN “+QString::number(num_GUN,10);
    QFont font(“宋体”,12,QFont::Bold);
    painter2.setFont(font);
    painter2.drawText(rect1,Qt::AlignCenter,str);
    }

    void MainWidget::draw_Information()
    {
    QPainter painter1(ui->label_Information);
    painter1.setPen(QPen(QColor(WHITE),1.5));
    QRect rect1(1,3,118,45);
    QRect rect2(1,3,118,24);
    QRect rect3(1,24,118,24);
    painter1.drawRect(rect1);
    QPainter painter2(ui->label_Information);
    painter2.setPen(QPen(QColor(WHITE),1.5));
    QString str = “BAY DOORS”;
    QFont font(“宋体”,12,QFont::Bold);
    painter2.setFont(font);
    painter2.drawText(rect2,Qt::AlignCenter,str);

    QPainter painter3(ui->label_Information);
    if(BAY_DOORS == "CLOSED")
    {
        painter3.setPen(QPen(QColor(GREEN),1.5));
    }
    else
    {
        painter3.setPen(QPen(QColor(RED),1.5));
    }
    QFont font1("宋体",12,QFont::Bold);
    painter3.setFont(font1);
    painter3.drawText(rect3,Qt::AlignCenter,BAY_DOORS);
    

    }

    void MainWidget::draw_Bay()
    {
    QPainter painter(ui->label_BAY);
    QRect rect1(0,0,30,16);

    if(BAY_DOORS == "CLOSED")
    {
        painter.setPen(QPen(QColor(GREEN),1.5));
    }
    else
    {
        painter.setPen(QPen(QColor(RED),1.5));
    }
    QString str = "BAY";
    QFont font("宋体",12,QFont::Bold);
    painter.setFont(font);
    painter.drawText(rect1,Qt::AlignCenter,str);
    

    }

    展开全文
  • QT仪表盘源码

    2017-03-17 23:07:28
    QT仪表盘源码
  • QT 仪表盘 Widget 源码

    2017-03-01 20:49:52
    QT汽车仪表盘控件源码。 已测,正常运行,效率比较高。
  • qt仪表盘实例,源代码给大家参考学习使用 可用于实际工程中。 qt仪表盘实例,源代码给大家参考学习使用 可用于实际工程中。 qt仪表盘实例,源代码给大家参考学习使用 可用于实际工程中。
  • qt 仪表盘程序

    2014-04-02 14:45:12
    qt c++编写的仪表盘和指针旋转程序,指定指针中心和旋转范围以及旋转点就ok了
  • QT 仪表盘制作

    千次阅读 2018-05-03 20:52:25
    QT主要提供三种图形界面:Widget,Graphics,QML Widget:适用于大量数据交互 Graphics:适用于场景中很多图元的 QML:解释型,属于轻量级界面,不适合大量数据交互,偏向视觉 这里提供的界面设计思想基于Graphics...

    QT主要提供三种图形界面:Widget,Graphics,QML

    • Widget:适用于大量数据交互
    • Graphics:适用于场景中很多图元的
    • QML:解释型,属于轻量级界面,不适合大量数据交互,偏向视觉

    这里提供的界面设计思想基于Graphics框架,采用SVG进行设计
    这里参考了一款飞行的开源软件https://sourceforge.net/projects/qfi/

    思路:

    1. 使用InKscape参考开源软件的仪表设计界面进行仪表零部件划设:背景、表盘、蒙版(基础使用方法参考:https://blog.csdn.net/uriel_chiang/article/details/80186267
    2. 使用QT中的类QGraphicsSvgItem加载设计出来的仪表零部件,设置其位置、大小(QT 工程文件 +svg模块)(使用方法参考:https://blog.csdn.net/uriel_chiang/article/details/80186546
    3. 使用QGraphicsScene放置所有Item,设置其层叠关系
    4. 使用QGraphicsView观看(显示)部分QGraphicsScene
    5. 动态移动、旋转表盘,动态生成QGraphicsTextItem文字显示数值

    注意:

    1. 背景移动和蒙版如果需要移动效果的话,建议将其拆分为n个更小的零部件
    2. 背景移动和蒙版如果需要移动逐渐改变颜色效果,建议将一个零部件拆分为两个,一个颜色(不需要时隐藏),需要时,设定其倍数覆盖在另一个颜色之上
    展开全文
  • 仪表盘控件QDial在Qt Designer的input widgets 模块,如下图: 仪表盘在车载行业用的比较多,显示车速,油量等信息, 拖拽一个QDial、QPressBar到界面上,如下图: QDial是一个Slider, 派生于...

         仪表盘控件QDial在Qt Designer的input widgets 模块,如下图:

     

         仪表盘在车载行业用的比较多,显示车速,油量等信息, 拖拽一个QDial、QPressBar到界面上,如下图:

        QDial是一个Slider, 派生于QAbstractSlider,也继承了它的信号,例如当仪表盘的值变化时,就会触发 valueChanged,这些都是它的父类QAbstractSlider的信号,如下:
    
    Q_SIGNALS:
        void valueChanged(int value);
        void sliderPressed();
        void sliderMoved(int position);
        void sliderReleased();
        void rangeChanged(int min, int max);
        void actionTriggered(int action);
       以上信号都很好理解。
       QDial还默认实现了鼠标滚轮、上下左右箭头、PageUp, PageDown,Home, End等事件。
       home:回到0值
       end:变为最大值,默认是100
    

          上面的demo当表盘移动时,右边的进度条的值也会跟着变。

           .cpp代码如下:

    #include "mainwindow.h"
    #include "ui_mainwindow.h"
    #include <QDebug>
    
    MainWindow::MainWindow(QWidget *parent)
        : QMainWindow(parent)
        , ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
    
        ui->progressBar->setValue(1);
        ui->progressBar->setMinimum(1);
        ui->progressBar->setMaximum(100);
    
        ui->dial->setMinimum(1);
        ui->dial->setMaximum(100);
        ui->dial->setNotchesVisible(true);  //显示刻度
        ui->dial->setPageStep(5);           //设置PageUp, PageDown的步长
        ui->dial->setNotchTarget(10);
    
        connect(ui->dial, &QDial::valueChanged, [this](int value){
            qDebug() << ui->dial->pageStep();
            ui->progressBar->setValue(value);
        });
    }
    
    MainWindow::~MainWindow()
    {
        delete ui;
    }

            仪表盘的初始化可以设置是否显示刻度,进度值等信息,信号槽我用了Qt5 lambda的写法,捕获this对象,就可以在匿名函数中使用进度条,其实这里是触发了的 QProgressBar::setValue,也可以用常规写法。如下:

    connect(ui->dial, &QDial::valueChanged, ui->progressBar, &QProgressBar::setValue);

           运行结果:

     

    展开全文
  • qt自绘仪表盘

    2016-04-02 09:48:11
    qt 仪表盘,非常具有参考价值
  • QT自定义仪表盘
  • 基于QT仪表盘

    2019-06-06 10:42:42
    基于QT仪表盘,具有动态延时变化的效果,跟游戏里面开车踩油门的过程一样的效果。
  • qt虚拟仪表表盘的绘制

    热门讨论 2011-08-29 11:21:11
    使用qt开发的一个虚拟仪表表盘 使用qt开发的一个虚拟仪表表盘
  • Qt:绘制仪表盘

    2020-11-21 09:52:18
    Qt:绘制仪表盘

    本文转载于用户MANY_L的文章Qt总结之八:绘制仪表盘,链接为:https://blog.csdn.net/Aidam_Bo/article/details/85266798

    前言

    (1)QPainter用来执行具体的绘图相关的操作,用来画点,线,填充,变换,alpha/阿尔法通道(透明度)。Alpha的值越大,就越不透明,范围是0-255,255就是不透明,0就是完全透明;当对应 RGB 颜色时, Alpha 会叠加到颜色上面;只有当 Alpha 通道是255时,才是其真正的颜色。

    (2)QPainterDevice是Qpainter用来绘图设备,Qt中有几种绘图的设备,如QWidget,Qpainter,QPaxmip 都是从QPainterDevice继承的。例如QPainter painter(this); 把绘图设备指针传递painter,把当前控件指针初始化。

    (3)QPainterEngine类提供了不同类型设备接口,对程序员不透明,由QPainter,QpaintDevive类进行交互 。
    一个绘图的操作流程就是:对一个QPainterDevice直接或间接调用Qpainter类。Qpainter类内部调用QpaintEngine进行绘图

    (4)QPainterEngine类通常是由QPainterDevice类负责创建和管理。
    Qwidget类,最低层的类,接收鼠标,键盘和从其他敞口系统的事件,并且绘制在屏幕上。

    (5)QPaintDevice类是所有可以绘制的对象的基类。个绘制设备就是一个可以使用QPainter来绘制的二维空间的抽象。绘画的能力由子类QWidget、QPixmap、QPicture和QPrinter来实现。绘制设备的默认坐标系统的原点在左上角。X向右增加,Y向下增加。单位是一个像素。这里有几种方法在使用绘制工具时来设置用户自定义的坐标系统,

    (6)Qt 绘图系统定义了两个绘制时使用的关键属性:画刷和画笔。(1)画刷使用QBrush描述,大多用于填充;(2)画笔使用QPen描述,大多用于绘制轮廓线。

    (7)QBrush定义了QPainter的填充模式,具有样式、颜色、渐变以及纹理等属性。画刷的style()定义了填充的样式,使用Qt::BrushStyle枚举,默认值是Qt::NoBrush,也就是不进行任何填充。QPen定义了用于QPainter应该怎样画线或者轮廓线。画笔具有样式、宽度、画刷、笔帽样式和连接样式等属性。画笔的样式style()定义了线的样式。画刷brush()用于填充画笔所绘制的线条。

    参考网址:http://blog.csdn.net/zhang_xch/article/details/9051067

    1. 绘制

    绘图的基本函数

    #ifndef SPEED_H
    #define SPEED_H
     
    #include <QtWidgets/QWidget>
    #include "ui_speed.h"
     
    class Speed : public QWidget
    {
    	Q_OBJECT
     
    public:
    	Speed(QWidget *parent = 0);
    	~Speed();
     
    protected:
    	void paintEvent(QPaintEvent *);
     
    	void drawCrown(QPainter *painter);
    	void drawBackground(QPainter *painter);
    	void drawScale(QPainter *painter);
    	void drawScaleNum(QPainter *painter);
    	void drawTitle(QPainter *painter);
    	void drawIndicator(QPainter *painter);
    	void drawNumericValue(QPainter *painter);
     
    private:
    	QColor m_background;
    	QColor m_foreground;
     
     
    	int m_maxValue;
    	int m_minValue;
    	int m_startAngle;
    	int m_endAngle;
     
    	int m_scaleMajor;
    	int m_scaleMinor;
    	double m_value;
    	int m_precision;
    	QTimer *m_updateTimer;
    	QString m_units;
    	QString m_title;
    	public Q_SLOTS:
    	void UpdateAngle();
     
    private:
    	Ui::SpeedClass ui;
    };
     
    #endif // SPEED_H
    

    上面的代码是能够绘画出图片的重要函数-重绘函数。只要出现以下几种情况,系统就会自动调用paintEvent方法。
    a)当窗口部件第一次显示时,系统会自动产生一个绘图事件
    b)重新调整窗口部件大小
    c)当窗口部件被其他部件遮挡,然后又再次显示出来时,就会对隐藏的区域产生一个重绘事件
    translate(qreal dx, qreal dy);坐标变换可以看做是painter当前的一个状态,我们可以用save()方法把当前的状态存到一个堆栈里,在用过 之后,再用restore()恢复

    注:
    坐标系统在绘制的过程中是至关重要的,首先做好坐标变换,把窗体的中心设置成坐标原点,(默认的坐标原点的窗体的左上方(0,0)向右是x->增长,向下是y->增长。)

    2. 绘制仪表盘

    2.1 绘制表冠

    首先就要绘制出两个个圆形,设置圆形的背景色,背景色采用渐变填充的方式,通过两个设置两个圆不同的填充颜色来形成一个色环,形成表冠。函数如下。使用的是线性渐变 QLinearGradient

    QLinearGradient(qreal xStart, qreal yStart, qreal xFinalStop, qreal yFinalStop); 
    

    使用这个类实例化一个对象。对象的四个参数,分别是 两个点的坐标,表示渐变的方向。

    setColorAt(qreal pos, const QColor &color); 
    

    pos是一个[0,1]的闭区间的数字。设置渐变坐标所表示的距离。的比例大小,0.2就是长度的1/5

    painter->save();
    painter->restore();
    

    基本上都是一起出现的,前者是保存当前坐标,然后进行变换操,后者是将以前的坐标系状 态恢复,其实就是一个入栈和出栈的操作。

    void Speed::drawCrown(QPainter *painter) //绘制表冠 
    { 
    painter->save(); 
    int radius = 100; 
    QLinearGradient lg1(0, -radius, 0, radius);
     
    lg1.setColorAt(0, Qt::white); //设置渐变的颜色和路径比例 
    lg1.setColorAt(1, Qt::gray); //只是粗略的颜色,具体的可以参考RGB颜色查询对照表
     
    painter->setBrush(lg1); // 创建QBrush对象,把这个渐变对象传递进去: 
    painter->setPen(Qt::NoPen); //边框线无色 
    painter->drawEllipse(-rad ius, -radius, radius << 1, radius << 1); 
    painter->setBrush(m_background = Qt::black); 
    painter->drawEllipse(-92, -92, 184, 184); 
    painter->restore(); 
    }
    

    2.2 绘制刻度值

    通过一套算法来实现绘制数字刻度

    void Speed::drawScaleNum(QPainter *painter) //绘制刻度数字 
    { 
    	painter->save(); 
    	painter->setPen(m_foreground); 
    	//m_startAngle是起始角度,m_endAngle是结束角度,m_scaleMajor在一个量程中分成的刻度数 
    	double startRad = ( 270-m_startAngle) * (3.14 / 180); 
    	double deltaRad = (360 - m_startAngle - m_endAngle) * (3.14 / 180) / m_scaleMajor; 
    	double sina,cosa; 
    	int x, y; 
    	QFontMetricsF fm(this->font()); 
    	double w, h, tmpVal; 
    	QString str;
    	 
    	for (int i = 0; i <= m_scaleMajor; i++)
    	{
    	    sina = sin(startRad - i * deltaRad);
    	    cosa = cos(startRad - i * deltaRad);
    	 
    	   tmpVal = 1.0 * i *((m_maxValue - m_minValue) / m_scaleMajor) + m_minValue;
    	   // tmpVal = 50;
    	    str = QString( "%1" ).arg(tmpVal);  //%1作为占位符   arg()函数比起 sprintf()来是类型安全的
    	    w = fm.size(Qt::TextSingleLine,str).width();
    	    h = fm.size(Qt::TextSingleLine,str).height();
    	    x = 82 * cosa - w / 2;
    	    y = -82 * sina + h / 4;
    	    painter->drawText(x, y, str); //函数的前两个参数是显示的坐标位置,后一个是显示的内容,是字符类型""
    	 
    	}
    	painter->restore();
    }
    

    2.3 绘制刻度线

    rotate(qreal a);//函数实现角度的旋转


     

    void Speed::drawScale(QPainter *painter) //绘制刻度线 
    { 
    	painter->save(); 
    	painter->rotate(m_startAngle); 
    	int steps = (m_scaleMajor * m_scaleMinor); //相乘后的值是分的份数 
    	double angleStep = (360.0 - m_startAngle - m_endAngle) / steps; //每一个份数的角度
    	 
    	// painter->setPen(m_foreground); //m_foreground是颜色的设置 
    	// QPen pen = painter->pen(); //第一种方法 
    	QPen pen ; 
    	pen.setColor(Qt::green); //推荐使用第二种方式 
    	for (int i = 0; i <= steps; i++) 
    	{ 
    		if (i % m_scaleMinor == 0)//整数刻度显示加粗 
    		{ 
    			pen.setWidth(1); //设置线宽 
    			painter->setPen(pen); //使用面向对象的思想,把画笔关联上画家。通过画家画出来
    			painter->drawLine(0, 62, 0, 72); //两个参数应该是两个坐标值
    		}
    		else
    		{
    			pen.setWidth(0);
    			painter->setPen(pen);
    			painter->drawLine(0, 67, 0, 72);
    		}
    		painter->rotate(angleStep);
    	}
    	painter->restore();
    }
    

    2.4 绘制标题

    void Speed::drawTitle(QPainter *painter) 
    { 
    	painter->save(); 
    	painter->setPen(m_foreground); 
    	//painter->setBrush(m_foreground); 
    	QString str(m_title); //显示仪表的功能 
    	QFontMetricsF fm(this->font()); 
    	double w = fm.size(Qt::TextSingleLine,str).width(); 
    	painter->drawText(-w / 2, -30, str); 
    	painter->restore(); 
    }
    

    2.5 显示单位与数值

    void Speed::drawNumericValue(QPainter *painter) 
    { 
    QString str = QString(%1 %2).arg(m_value, 0, ‘f’, m_precision).arg(m_units); 
    QFontMetricsF fm(font()); 
    double w = fm.size(Qt::TextSingleLine,str).width(); 
    painter->setPen(m_foreground); 
    painter->drawText(-w / 2, 42, str); 
    }
    

    2.6 绘制表针,和中心点

    void Speed::drawIndicator(QPainter *painter)
    {
    	painter->save();
    	QPolygon pts;
    	pts.setPoints(3, -2, 0, 2, 0, 0, 60);	/* (-2,0)/(2,0)/(0,60) *///第一个参数是 ,坐标的个数。后边的是坐标
     
    	painter->rotate(m_startAngle);
    	double degRotate = (360.0 - m_startAngle - m_endAngle) / (m_maxValue - m_minValue)*(m_value - m_minValue);
     
    	//画指针
    	painter->rotate(degRotate);  //顺时针旋转坐标系统
    	QRadialGradient haloGradient(0, 0, 60, 0, 0);  //辐射渐变
    	haloGradient.setColorAt(0, QColor(60, 60, 60));
    	haloGradient.setColorAt(1, QColor(160, 160, 160)); //灰
    	painter->setPen(Qt::white); //定义线条文本颜色  设置线条的颜色
    	painter->setBrush(haloGradient);//刷子定义形状如何填满 填充后的颜色
    	painter->drawConvexPolygon(pts); //这是个重载函数,绘制多边形。
    	painter->restore();
     
    	//画中心点
    	QColor niceBlue(150, 150, 200);
    	QConicalGradient coneGradient(0, 0, -90.0);  //角度渐变
    	coneGradient.setColorAt(0.0, Qt::darkGray);
    	coneGradient.setColorAt(0.2, niceBlue);
    	coneGradient.setColorAt(0.5, Qt::white);
    	coneGradient.setColorAt(1.0, Qt::darkGray);
    	painter->setPen(Qt::NoPen);  //没有线,填满没有边界
    	painter->setBrush(coneGradient);
    	painter->drawEllipse(-5, -5, 10, 10);
    }
    

    2.7 重绘函数

    void Speed ::paintEvent(QPaintEvent *)
    { 
        QPainter painter(this);//一个类中的this表示一个指向该类自己的指针
        painter.setRenderHint(QPainter::Antialiasing);  /* 使用反锯齿(如果可用) */
        painter.translate(width() / 2, height() / 2);   /* 坐标变换为窗体中心 */
        int side = qMin(width(), height());
        painter.scale(side / 200.0, side / 200.0);      /* 比例缩放 */
     
       drawCrown(&painter);                                 /* 画表盘边框 */
       drawScaleNum(&painter);                          /* 画刻度数值值 */
       drawScale(&painter);                                 /* 画刻度线 */
       drawTitle(&painter);                                     /* 画单位 */
       drawNumericValue(&painter);                      /* 画数字显示 */
       drawIndicator(&painter);                             /* 画表针 */
     
    }
    

    2.8 构造函数的初始化

    m_background = Qt::black;
    m_foreground = Qt::green;
     
    m_startAngle = 60;
    m_endAngle = 60;
    m_scaleMajor = 10;
    m_minValue = 0;
    m_maxValue = 100;
    m_scaleMajor = 10;//分度
    m_scaleMinor = 10;
    m_units = "km/h";
    m_title = "Speed Meter";
    m_precision = 0;
    m_value = 0;
     
    m_updateTimer = new QTimer(this);
    m_updateTimer->setInterval(50);//间隔,微妙微单位,大家可以改一下这个值看看转动速度。
    connect(m_updateTimer, SIGNAL(timeout()), this, SLOT(UpdateAngle()));
    m_updateTimer->start();//启动定时器
     
    setWindowFlags(Qt::FramelessWindowHint);//无窗体
    setAttribute(Qt::WA_TranslucentBackground);//背景透明
    resize(400, 400);
    

    效果图

    表盘中海添加了定时器,来实现动态的效果

    展开全文
  • QT绘制仪表盘

    千次阅读 2019-09-05 13:36:36
    最近在整理代码,发现以前写的绘制仪表盘Demo,特发出记录下。 显示的效果如下: 直接上代码: #ifndef T3DASHBOARD_H #define T3DASHBOARD_H /** *******************************************************...
  • qt绘制的汽车仪表盘,表盘还是比较漂亮的,使用Qt环形渐变进行表盘外围的颜色值置,简单Demo展示
  • Qt仪表盘控件

    2020-08-22 15:02:05
    基于QWidget实现的仪表盘控件。效果如图,代码自取,请放心食用(建议使用Qt中提升控件方法使用)。 源码 fr_dash_board.h #ifndef FR_DASH_BOARD_H #define FR_DASH_BOARD_H #include <qwidget.h> class ...
  • Qt 3D 汽车仪表盘

    2020-03-26 17:43:43
    使用Qt3D开发汽车仪表盘 blender建模仪表盘模型和汽车模型,导入Qt中,qt中qml编程实现模型的动画效果。 相对OpenGL,Qt3D的实现更简单,模型的颜色在blender中预先设置好,导入Qt中,调节好灯光,就可以显示炫酷的...
  • Qt自定义仪表盘Demo01

    2019-10-28 14:52:32
    Qt自己绘制简单仪表盘控件Demo01 Demo01展示: Demo01源码下载地址: 添加链接描述
  • Qt 绘制仪表盘

    万次阅读 2017-03-17 23:18:34
    //每一次Qt刷新,指针改变的的度数 # define Needle_Step 1 //初始化 SPDWidget::SPDWidget(QWidget *parent) : QWidget(parent) { this ->resize( 320 , 320 ); pix_Needle.load( "./res/style_1/...
  • Qt编写三色圆环仪表盘
  • QT编写的速度仪表盘

    2018-03-07 09:59:52
    QT4编写了动态的速度仪表盘,纯代码绘制,画仪表盘可以借鉴
  • Qt绘制的多彩仪表盘

    2019-10-28 14:45:46
    Qt绘制的多彩仪表盘简单Demo,指针所指向的面积划过的区域设置填充渐变,相对比较漂亮,Qt5下载直接编译运行,源码可见
  • 汽车仪表盘Qt demo

    2017-10-16 11:28:00
    基于Qt5.6.2的汽车仪表盘demo,QML语法。功能界面有随机时速表和转速表,左转向灯
  • QT控件仪表盘等.zip

    2020-03-26 07:28:01
    QT精美控件含源码,约20个左右,包含头文件和实现文件,设计精美
  • Qt仪表盘的绘制

    千次阅读 2018-08-05 17:01:27
    网上看到了一些炫酷的仪表盘的界面,很是心痒痒,打算自己也实现一下。 首先,仪表盘分为以下几个组成部分:表盘,指针,刻度,刻度文字,速度显示等。全部操作都是通过QPainter实现的。界面不是很好看,在此...
  • [开源]Qt圆弧仪表盘

    千次阅读 2019-07-12 10:43:34
    看了大神分享的仪表盘Qt编写自定义控件-圆弧仪表盘),代码不开源。哈哈,看着不错,就照着画画。 开源,开源,开源啦,唉,喊不动了,还是码字吧... 先上效果对比图(录制的gif效果不好,无奈选了jpg截图) ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 436
精华内容 174
关键字:

qt仪表盘