Qt 汽车仪表 QWidget

今天是2016年的最后一个工作日,在这个最后工作日里面,和以为网友要了一点练手的素材文件,经过网友确认,不涉及商业机密,在这里分享一下,如侵权,请联系我删除、

 

先上程序运行图

 

 

 

这里显示数字,闪烁等都没有问题,唯一的问题就是这个速度指针的绘制问题,在代码中我使用的是用QPainter绘制image。锯齿好严重,这里我已经开了抗锯齿

 

painter.setRenderHint(QPainter::Antialiasing,true);

但是效果几乎没有,是操作不对,还是需要特殊设置了

 

 

剩下的就是分享代码了

 

首先就是这个指针的绘制代码

 

ui->label->setStyleSheet("border-image:url(:/source/beijing.bmp)");
    ui->label->installEventFilter(this);
    image_pointer.load(":/source/222.png");

 

 

 

 

 

这里主要就是设置大背景,就是后面的那么最大的仪表界面,剩下的就是为这个要在Qlabel上面绘制指针,需要为QLabel注册绘制事件,否则程序会滤掉这个绘制事件

 

绘制指针代码

 

void Widget::painter_car()
{
    QPainter painter(ui->label);
    painter.setRenderHint(QPainter::Antialiasing,true);
    painter.translate(960,360);
    painter.save();
    painter.rotate(pointer_number);
    QRectF target(-40,-267.0,80.0,336.0);
    QRectF source(0.0,0.0,80.0,336.0);
    painter.drawImage(target,image_pointer,source);


    painter.restore();

}

这里新建Qpainter继承值Qlabel

 

设置开抗锯齿,几乎没有效果,我都怀疑执行了没有

 

移动Qpainter 的原始坐标点

 

完了就是简单的绘制 , 

 

剩下的就是数字仪表的显示

 

这里我新建了一个专门显示数字的界面

这个几面来负责显示七位数字

 

数字显示源代码:

 

头文件

 

 

#ifndef NUMBER_H
#define NUMBER_H

#include <QWidget>

namespace Ui {
class Number;
}

class Number : public QWidget
{
    Q_OBJECT

public:
    explicit Number(QWidget *parent = 0);
    ~Number();
    void set_Number(int number);

private:
    void set_image(int flag,int number);
private:
    Ui::Number *ui;
};

#endif // NUMBER_H

 

 

源文件

 

#include "number.h"
#include "ui_number.h"
#include <QDebug>
Number::Number(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Number)
{
    ui->setupUi(this);
}

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

void Number::set_Number(int number)
{
    if(number==0)
    {
        set_image(1,0);
    }
    set_image(1,number%10);
    if(number/10>0)
    {
        set_image(2,number/10);
    }
    if(number/100>0)
    {
        set_image(3,number/100);
    }
    if(number/1000>0)
    {
        set_image(4,number/1000);
    }
    if(number/10000>0)
    {
        set_image(5,number/10000);
    }
    if(number/100000>0)
    {
        set_image(6,number/100000);
    }
    if(number/1000000>0)
    {
        set_image(7,number/1000000);
    }

}

void Number::set_image(int flag, int number)
{
    switch (flag) {
    case 1:
        switch (number) {
        case 0:
            ui->label->setStyleSheet("border-image:url(:/source/0.png)");
            break;
        case 1:
            ui->label->setStyleSheet("border-image:url(:/source/1.png)");
            break;
        case 2:
            ui->label->setStyleSheet("border-image:url(:/source/2.png)");
            break;
        case 3:
            ui->label->setStyleSheet("border-image:url(:/source/3.png)");
            break;
        case 4:
            ui->label->setStyleSheet("border-image:url(:/source/4.png)");
            break;
        case 5:
            ui->label->setStyleSheet("border-image:url(:/source/5.png)");
            break;
        case 6:
            ui->label->setStyleSheet("border-image:url(:/source/6.png)");
            break;
        case 7:
            ui->label->setStyleSheet("border-image:url(:/source/7.png)");
            break;
        case 8:
            ui->label->setStyleSheet("border-image:url(:/source/8.png)");
            break;
        case 9:
            ui->label->setStyleSheet("border-image:url(:/source/9.png)");
            break;
        }
        break;
    case 2:
        switch (number) {
        case 0:
            ui->label_2->setStyleSheet("border-image:url(:/source/0.png)");
            break;
        case 1:
            ui->label_2->setStyleSheet("border-image:url(:/source/1.png)");
            break;
        case 2:
            ui->label_2->setStyleSheet("border-image:url(:/source/2.png)");
            break;
        case 3:
            ui->label_2->setStyleSheet("border-image:url(:/source/3.png)");
            break;
        case 4:
            ui->label_2->setStyleSheet("border-image:url(:/source/4.png)");
            break;
        case 5:
            ui->label_2->setStyleSheet("border-image:url(:/source/5.png)");
            break;
        case 6:
            ui->label_2->setStyleSheet("border-image:url(:/source/6.png)");
            break;
        case 7:
            ui->label_2->setStyleSheet("border-image:url(:/source/7.png)");
            break;
        case 8:
            ui->label_2->setStyleSheet("border-image:url(:/source/8.png)");
            break;
        case 9:
            ui->label_2->setStyleSheet("border-image:url(:/source/9.png)");
            break;
        }
        break;
    case 3:
        switch (number) {
        case 0:
            ui->label_3->setStyleSheet("border-image:url(:/source/0.png)");
            break;
        case 1:
            ui->label_3->setStyleSheet("border-image:url(:/source/1.png)");
            break;
        case 2:
            ui->label_3->setStyleSheet("border-image:url(:/source/2.png)");
            break;
        case 3:
            ui->label_3->setStyleSheet("border-image:url(:/source/3.png)");
            break;
        case 4:
            ui->label_3->setStyleSheet("border-image:url(:/source/4.png)");
            break;
        case 5:
            ui->label_3->setStyleSheet("border-image:url(:/source/5.png)");
            break;
        case 6:
            ui->label_3->setStyleSheet("border-image:url(:/source/6.png)");
            break;
        case 7:
            ui->label_3->setStyleSheet("border-image:url(:/source/7.png)");
            break;
        case 8:
            ui->label_3->setStyleSheet("border-image:url(:/source/8.png)");
            break;
        case 9:
            ui->label_3->setStyleSheet("border-image:url(:/source/9.png)");
            break;
        }
        break;
    case 4:
        switch (number) {
        case 0:
            ui->label_4->setStyleSheet("border-image:url(:/source/0.png)");
            break;
        case 1:
            ui->label_4->setStyleSheet("border-image:url(:/source/1.png)");
            break;
        case 2:
            ui->label_4->setStyleSheet("border-image:url(:/source/2.png)");
            break;
        case 3:
            ui->label_4->setStyleSheet("border-image:url(:/source/3.png)");
            break;
        case 4:
            ui->label_4->setStyleSheet("border-image:url(:/source/4.png)");
            break;
        case 5:
            ui->label_4->setStyleSheet("border-image:url(:/source/5.png)");
            break;
        case 6:
            ui->label_4->setStyleSheet("border-image:url(:/source/6.png)");
            break;
        case 7:
            ui->label_4->setStyleSheet("border-image:url(:/source/7.png)");
            break;
        case 8:
            ui->label_4->setStyleSheet("border-image:url(:/source/8.png)");
            break;
        case 9:
            ui->label_4->setStyleSheet("border-image:url(:/source/9.png)");
            break;
        }
        break;
    case 5:
        switch (number) {
        case 0:
            ui->label_5->setStyleSheet("border-image:url(:/source/0.png)");
            break;
        case 1:
            ui->label_5->setStyleSheet("border-image:url(:/source/1.png)");
            break;
        case 2:
            ui->label_5->setStyleSheet("border-image:url(:/source/2.png)");
            break;
        case 3:
            ui->label_5->setStyleSheet("border-image:url(:/source/3.png)");
            break;
        case 4:
            ui->label_5->setStyleSheet("border-image:url(:/source/4.png)");
            break;
        case 5:
            ui->label_5->setStyleSheet("border-image:url(:/source/5.png)");
            break;
        case 6:
            ui->label_5->setStyleSheet("border-image:url(:/source/6.png)");
            break;
        case 7:
            ui->label_5->setStyleSheet("border-image:url(:/source/7.png)");
            break;
        case 8:
            ui->label_5->setStyleSheet("border-image:url(:/source/8.png)");
            break;
        case 9:
            ui->label_5->setStyleSheet("border-image:url(:/source/9.png)");
            break;
        }
        break;
    case 6:
        switch (number) {
        case 0:
            ui->label_6->setStyleSheet("border-image:url(:/source/0.png)");
            break;
        case 1:
            ui->label_6->setStyleSheet("border-image:url(:/source/1.png)");
            break;
        case 2:
            ui->label_6->setStyleSheet("border-image:url(:/source/2.png)");
            break;
        case 3:
            ui->label_6->setStyleSheet("border-image:url(:/source/3.png)");
            break;
        case 4:
            ui->label_6->setStyleSheet("border-image:url(:/source/4.png)");
            break;
        case 5:
            ui->label_6->setStyleSheet("border-image:url(:/source/5.png)");
            break;
        case 6:
            ui->label_6->setStyleSheet("border-image:url(:/source/6.png)");
            break;
        case 7:
            ui->label_6->setStyleSheet("border-image:url(:/source/7.png)");
            break;
        case 8:
            ui->label_6->setStyleSheet("border-image:url(:/source/8.png)");
            break;
        case 9:
            ui->label_6->setStyleSheet("border-image:url(:/source/9.png)");
            break;
        }
        break;
    case 7:
        switch (number) {
        case 0:
            ui->label_7->setStyleSheet("border-image:url(:/source/0.png)");
            break;
        case 1:
            ui->label_7->setStyleSheet("border-image:url(:/source/1.png)");
            break;
        case 2:
            ui->label_7->setStyleSheet("border-image:url(:/source/2.png)");
            break;
        case 3:
            ui->label_7->setStyleSheet("border-image:url(:/source/3.png)");
            break;
        case 4:
            ui->label_7->setStyleSheet("border-image:url(:/source/4.png)");
            break;
        case 5:
            ui->label_7->setStyleSheet("border-image:url(:/source/5.png)");
            break;
        case 6:
            ui->label_7->setStyleSheet("border-image:url(:/source/6.png)");
            break;
        case 7:
            ui->label_7->setStyleSheet("border-image:url(:/source/7.png)");
            break;
        case 8:
            ui->label_7->setStyleSheet("border-image:url(:/source/8.png)");
            break;
        case 9:
            ui->label_7->setStyleSheet("border-image:url(:/source/9.png)");
            break;
        }
        break;

    }
}

 

 

 

 

 

 

 


这里代码开着有点多,其实没有什么含量,说白了就是给七个QLabel换背景

 

使用情况

 

 

    number_1 = new Number(ui->widget_1);
    number_1->resize(175,32);
    number_1->move(0,0);
    number_1->set_Number(temp);
    number_1->show();

    number_2 = new Number(ui->widget_2);
    number_2->resize(175,32);
    number_2->move(0,0);
    number_2->set_Number(temp);
    number_2->show();

    number_3 = new Number(ui->widget_3);
    number_3->resize(175,32);
    number_3->move(0,0);
    number_3->set_Number(temp);
    number_3->show();

    number_4 = new Number(ui->widget_4);
    number_4->resize(175,32);
    number_4->move(0,0);
    number_4->set_Number(temp);
    number_4->show();

    number_5 = new Number(ui->widget_5);
    number_5->resize(175,32);
    number_5->move(0,0);
    number_5->set_Number(temp);
    number_5->show();

    number_6 = new Number(ui->widget_6);
    number_6->resize(175,32);
    number_6->move(0,0);
    number_6->set_Number(temp);
    number_6->show();


新建6个界面实例,

 

 

 

bool flag_pointer = true;
void Widget::timerout_poinyer()
{
    if(flag_pointer)
    {
        if(pointer_number<135)
        {
            ++pointer_number;
            if(pointer_number == 135)
            {
                flag_pointer = false;
            }
        }
    }
    else
    {
        if(pointer_number>-135)
        {
            --pointer_number;
            if(pointer_number == -135)
            {
                flag_pointer = true;
            }
        }
    }
    ++temp;
    if(temp>999999)
    {
        temp = 0;
    }
    number_1->set_Number(temp);
    number_2->set_Number(temp);
    number_3->set_Number(temp);
    number_4->set_Number(temp);
    number_5->set_Number(temp);
    number_6->set_Number(temp);
    this->update();
}

 


在这里来刷新指针和刷新数字界面的显示

 

 

 

 

大家可能看到图中有的界面是有那个没有系安全带的图标,有的有,这里是实现了一个1Hz的图标闪烁,其实原理很简单,就是QLabel的隐藏,显示,再隐藏,再显示。。。

 

实现代码:

 

void Widget::timeout_people()
{
    if(ui->label_people->isHidden())
    {
        ui->label_people->show();
    }
    else
    {
        ui->label_people->hide();
    }
}

 

 

 

 

 

 

  • 12
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 33
    评论
### 回答1: Qt是一种跨平台的C++开发框架,它提供了丰富的GUI组件库,使得开发者可以轻松地设计和创建各种控件和界面。自定义控件从一定程度上方便了程序的编写,让程序更加直观,使用得当的自定义控件可以让程序增添不少精彩细节。仪表盘是一种比较常见的自定义控件,它可以用来显示实时数据,例如速度,油量,温度等等。下面来简单介绍一下用Qt自定义一个仪表盘的一些步骤。 首先要构思好仪表盘的外观和功能,比如可以考虑盘的大小,采用什么颜色,显示哪些数据等等。 其次,需要用Qt中提供的基础控件(如QPainter、QPoint、QRect)来构建自定义控件的各个部分,包括盘表、指针、刻度等,然后为这些部分设置合适的属性(如颜色、位置、宽度等)。 接着,需要实现控件的数据传递和刷新。一般情况下,会使用定时器或者事件触发来更新控件显示的数据。考虑到仪表盘是一种实时显示数据的控件,所以在设计数据刷新时需要保证刷新频率足够高,否则会出现卡顿、显示延迟等问题。 最后,为了方便其他的开发者使用该自定义控件,可以将其打包成独立的Qt插件,或者直接将自定义控件的源代码公开发布。 以上就是简单的Qt自定义控件仪表盘的一些步骤,开发者可以根据自己的需求进行相应更改和优化。总之自定义控件并不是一件简单的事情,但是如果能够掌握好最基本的知识,就能够创造出更加精美、实用的自定义控件。 ### 回答2: Qt自定义控件仪表盘可以用于需要展示数据的界面设计。通过自定义仪表盘,可以实现不同样式和功能的展示,并且能够满足不同场景下的需求。 在Qt中,仪表盘的设计可以通过绘图、圆弧、指针和动画的实现,使得界面更加直观、美观,也更加容易被用户理解和操作。可以通过Qt提供的QPainter绘图工具绘制圆弧,也可以通过QTimer控制指针的动画效果。 另外,仪表盘也是可以与其他控件进行绑定的。通过信号与槽的机制,可以将仪表盘的数值与其他控件进行绑定,实现更加复杂的界面功能。 需要特别注意的是,仪表盘的设计需要考虑到不同屏幕分辨率的适配性。通过使用Qt提供的屏幕适配机制,可以实现不同分辨率下的仪表盘展示效果。 总之,Qt自定义控件仪表盘是一个非常实用、优雅的设计元素,可以帮助开发者快速开发出漂亮的界面,并且提高用户体验。 ### 回答3: Qt是一个强大的C++跨平台框架,自带了很多常用的UI控件,但是有时候我们也需要自定义一些控件来满足我们的需求。今天我们来介绍一下如何使用Qt自定义一个仪表盘控件。 首先我们需要继承QWidget类,命名为Dashboard。然后我们需要在Dashboard的构造函数中初始化一些常量,比如外部圆弧的宽度、内部圆弧的半径等等。接着我们需要重写paintEvent函数,绘制仪表盘的外部圆弧、刻度、指针等等,具体绘制方式可以根据需求灵活设置。 为了使仪表盘可以在Qt Designer中拖拽使用,我们需要在Dashboard类中加入QIB_DESIGNER_EXPORT_WIDGETS宏。最后在.pro文件中添加如下代码: ``` QT += designer TARGET = Dashboard TEMPLATE = lib HEADERS += Dashboard.h SOURCES += Dashboard.cpp QIB_DESIGNER_EXPORT_WIDGETS(Dashboard) ``` 这样我们就可以在Qt Designer中使用Dashboard自定义控件了。当然,使用自定义控件也需要相应的信号槽机制来进行交互操作。 总的来说,自定义控件可以更好地满足我们的需求,同时也可以提高界面的美观度。在自定义控件的过程中,我们要考虑到控件的可扩展性、易用性以及代码的可维护性等方面,并在不断地改进和优化中,不断提高自己的技术水平。
评论 33
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DreamLife.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值