Qwt 使用QwtDial绘制汽车仪表盘

news/2024/7/9 4:14:12 标签: 汽车, qt, qwt, QwtDial, 仪表盘

1.概述

QwtDial是Qwt库中的一个类,用于绘制一个可旋转的仪表盘

以下是类继承关系:

2.常用方法

void setOrigin(double origin) 设置仪表盘的原点角度,以度为单位,默认为0度,正值为逆时针旋转,负值为顺时针旋转。

void setScaleArc (double minArc, double maxArc) 设置最小、最大角度

void setMinScaleArc (double) 设置刻度盘的最小角度

void setMaxScaleArc (double) 设置刻度盘的最大角度

void setValue(double value) 设置当前指示器的值。

void setNeedle(QwtDialSimpleNeedle *needle) 设置指针的样式,可以通过创建一个QwtDialNeedle指针对象并设置其样式来自定义指针。

void setScaleDraw (QwtRoundScaleDraw *) 设置绘制的坐标轴

void setScale (double lowerBound, double upperBound) 设置范围

void setScaleStepSize (double stepSize) 设置步长

3.示例


 

自定义SpeedoMeter类继承QwtDial

#ifndef SPEEDOMETER_H
#define SPEEDOMETER_H

#include <QPainter>
#include "qwt_dial.h"
#include "qwt_round_scale_draw.h"
#include "qwt_dial_needle.h"

class SpeedoMeter : public QwtDial
{
public:
    SpeedoMeter( QWidget* parent = NULL );

    void setLabel( const QString& );
    QString label() const;

protected:
    virtual void drawScaleContents( QPainter* painter,
      const QPointF& center, double radius ) const QWT_OVERRIDE;

private:
    QString m_label;
};

#endif // SPEEDOMETER_H

#include "SpeedoMeter.h"
#include <QPainter>

SpeedoMeter::SpeedoMeter( QWidget* parent )
    : QwtDial( parent )
    , m_label( "km/h" )
{
    QwtRoundScaleDraw* scaleDraw = new QwtRoundScaleDraw();
    scaleDraw->setSpacing( 8 );
    scaleDraw->enableComponent( QwtAbstractScaleDraw::Backbone, false );
    scaleDraw->setTickLength( QwtScaleDiv::MinorTick, 0 );
    scaleDraw->setTickLength( QwtScaleDiv::MediumTick, 4 );
    scaleDraw->setTickLength( QwtScaleDiv::MajorTick, 8 );
    setScaleDraw( scaleDraw );

    setWrapping( false );
    setReadOnly( true );

    setOrigin( 135.0 );
    setScaleArc( 0.0, 270.0 );

    QwtDialSimpleNeedle* needle = new QwtDialSimpleNeedle(
        QwtDialSimpleNeedle::Arrow, true, Qt::red,
        QColor( Qt::gray ).lighter( 130 ) );
    setNeedle( needle );

    setScaleStepSize( 20.0 );
    setScale( 0.0, 240.0 );
    this->scaleDraw()->setPenWidthF( 2 );
}

void SpeedoMeter::setLabel( const QString& label )
{
    m_label = label;
    update();
}

QString SpeedoMeter::label() const
{
    return m_label;
}

void SpeedoMeter::drawScaleContents( QPainter* painter,
    const QPointF& center, double radius ) const
{
    QRectF rect( 0.0, 0.0, 2.0 * radius, 2.0 * radius - 10.0 );
    rect.moveCenter( center );

    const QColor color = palette().color( QPalette::Text );
    painter->setPen( color );

    const int flags = Qt::AlignBottom | Qt::AlignHCenter;
    painter->drawText( rect, flags, m_label );
}

使用:

#ifndef SPEEDOMETERWIDGET_H
#define SPEEDOMETERWIDGET_H

#include <QWidget>
#include <QTimerEvent>

namespace Ui {
class SpeedoMeterWidget;
}

class SpeedoMeterWidget : public QWidget
{
    Q_OBJECT

public:
    explicit SpeedoMeterWidget(QWidget *parent = 0);
    ~SpeedoMeterWidget();

    void changeSpeed();

protected:
    virtual void timerEvent( QTimerEvent* event );

private:
    Ui::SpeedoMeterWidget *ui;

    int m_timerId;
};

#endif // SPEEDOMETERWIDGET_H


#include "SpeedoMeterWidget.h"
#include "ui_SpeedoMeterWidget.h"
#include "qwt_dial.h"
#include "qwt_round_scale_draw.h"
#include "qwt_dial_needle.h"
#include "SpeedoMeter.h"

static QPalette colorTheme( const QColor& base )
{
    QPalette palette;
    palette.setColor( QPalette::Base, base );
    palette.setColor( QPalette::Window, base.darker( 150 ) );
    palette.setColor( QPalette::Mid, base.darker( 110 ) );
    palette.setColor( QPalette::Light, base.lighter( 170 ) );
    palette.setColor( QPalette::Dark, base.darker( 170 ) );
    palette.setColor( QPalette::Text, base.darker( 200 ).lighter( 800 ) );
    palette.setColor( QPalette::WindowText, base.darker( 200 ) );

    return palette;
}

static SpeedoMeter *g_dial = nullptr;
SpeedoMeterWidget::SpeedoMeterWidget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::SpeedoMeterWidget)
{
    ui->setupUi(this);

    setPalette( colorTheme( QColor( Qt::darkGray ).darker( 150 ) ) );

    g_dial = new SpeedoMeter(this);
    g_dial->setFrameShadow( QwtDial::Sunken );
    ui->verticalLayout->addWidget(g_dial);

    m_timerId = startTimer( 50 );
}

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

void SpeedoMeterWidget::changeSpeed()
{
    static double offset = 0.8;

    double speed = g_dial->value();

    if ( ( speed < 7.0 && offset < 0.0 ) ||
        ( speed > 203.0 && offset > 0.0 ) )
    {
        offset = -offset;
    }

    static int counter = 0;

    switch( counter++ % 12 )
    {
        case 0:
        case 2:
        case 7:
        case 8:
            break;
        default:
            g_dial->setValue( speed + offset );
    }
}

void SpeedoMeterWidget::timerEvent(QTimerEvent *event)
{
    if ( event->timerId() == m_timerId )
    {
        changeSpeed();
        return;
    }
}


http://www.niftyadmin.cn/n/5142352.html

相关文章

ConcurrentLinkedDeque详解-Deque接口链表实现方案

简介 ConcurrentLinkedDeque是一种基于链表实现的线程安全的双端队列Deque。它提供了高效的并发访问和操作&#xff0c;适用于高并发场景下的数据共享和交互。 主要特点 线程安全 &#xff1a;ConcurrentLinkedDeque通过使用线程安全的并发控制机制&#xff0c;如内部分锁和C…

【人工智能Ⅰ】5-粒子群算法

【人工智能Ⅰ】5-粒子群算法 文章目录 【人工智能Ⅰ】5-粒子群算法5.1 粒子群算法PSO基本思想5.2 PSO介绍5.3 PSO求最优解5.4 算法流程5.5 PSO构成要素群体大小m权重因子最大速度Vm停止准则粒子空间的初始化领域的拓扑结构 5.6 PSO应用5.7 PSO改进动态调整惯性权重收缩因子法 5…

ESP32网络开发实例-使用密码登录Web服务器

使用密码登录Web服务器 文章目录 使用密码登录Web服务器1、软件准备2、硬件准备3、代码实现在本文中,我们将使用 ESP32 和 Arduino IDE 设计一个受密码保护的 Web 服务器。 如果您使用 ESP32 制作了家庭自动化项目并且您正在访问 Web 服务器上的所有信息,并且您希望通过添加密…

智慧公厕:让城市更宜居的升级之路

随着智慧城市建设的不断推进&#xff0c;公共厕所的升级改造也成为了重要的一环。智慧公厕的强大功能正助力着公共厕所的升级进程&#xff0c;为城市居民和游客提供更加便利和舒适的厕所体验。本文将以智慧公厕实力源头厂家广州中期科技有限公司专业的智慧公厕整体解决方案&…

curl 断点续传

如何断点续传&#xff1a; curl “xxxxurl” -o RealisticPhotography_v10.safetensors 要实现断点续传&#xff0c;您可以使用curl工具并添加一些参数&#xff0c;以便在下载中断后恢复下载。下面是如何使用curl进行断点续传的方法&#xff1a; 首先&#xff0c;确保您已经安…

Nginx+keepalived实现七层的负载均衡

1.keepalived VRRP 介绍 keepalived是什么&#xff1f; keepalived是集群管理中保证集群高可用的一个服务软件&#xff0c;用来防止单点故障。 keepalived工作原理 keepalived是以VRRP协议为实现基础的&#xff0c;VRRP全称Virtual Router Redundancy Protocol&…

【Unity编辑器扩展】艺术字/自定义图片字体生成工具

艺术字在游戏中很常用&#xff0c;由于普通字体样式过于平淡&#xff0c;制作花里胡哨的文字图片作为游戏字体使用&#xff0c;这就是艺术字。 不依赖第三方工具&#xff0c;仅使用Unity自带的Custom Font 一张艺术字图集就能实现这个功能&#xff0c;但是为了便于使用&#…

Verilog:写流水灯时遇到的问题

module flow_led(input sys_clk, //系统时钟50Mhz 周期0.02nsinput sys_rst_n, //系统异步复位&#xff0c;低电平有效output reg [3:0] led ); reg [24:0] cnt;//计数器计时0.5s250000000*0.02ns always(posedge sys_clk or negedge sys_rst_n)beginif(!sys_rst_n)cnt <…