Qt自定義控件之儀表盤1--簡單的貼圖儀表盤


0、前言

  學程序首先要輸出hell world,學電子要先來個流水燈。學Qt,那就必須先來個自定義控件,若有人問我從哪個下手,我推薦儀表盤,可簡可繁,從低配到高配齊全,可入門也可進階。

1、儀表盤解析

以常見的、傳統的儀表盤為例,分解儀表盤的元素,主要有邊框、刻度、數字、指針(或數字值、代替指針或二者都有)。邊框就是背景圖,可以動態的繪出也可以用一個圖片貼圖,指針可以繪出也可以用圖片旋轉來實現。其他的有刻度、數字、以及隨着數值變化而引起的特效。

2、貼圖的儀表盤

貼圖儀表盤比較簡單。實現方式:先找好2張圖,一張背景圖,帶有刻度數字指示的。一張指針圖。程序運行的時候旋轉指針就可以實現儀表盤動起來的效果。雖然方式很簡陋,但在某些場合具有奇特的效果,比如嵌入式場合,大名鼎鼎的迪文工業屏,都是用着這種方式,使用者基本不需要任何編程,只導入兩張漂亮的美工圖,然后動態控制指針的旋轉角度,就可以實現漂亮的儀表盤。

第一步,找資源:

第二步,添加資源文件到qt:

第三步:寫dial類,使用painter重繪表盤和指針

#ifndef DIAL_H
#define DIAL_H

#include <QWidget>

class Dial : public QWidget
{
    Q_OBJECT
public:
    explicit Dial(QWidget *parent = nullptr);

private:
    int value;
    void paintEvent(QPaintEvent *event);

signals:

public slots:
    void valueChanged(int value);
};

#endif // DIAL_H

#include "dial.h"
#include<QPainter>
#include<QDebug>

Dial::Dial(QWidget *parent) : QWidget(parent)
{

}

void Dial::paintEvent(QPaintEvent *event)
{
    Q_UNUSED(event);
    QPainter painter(this);
    painter.save();
    painter.setRenderHint(QPainter::SmoothPixmapTransform, true); //平滑像素圖

    painter.translate(this->width()/2, this->height()/2); // 原點定位
    QPixmap img = QPixmap(":/image/background.png");
    painter.drawPixmap(-img.width()/2, -img.height()/2, img); // 背景圖

    QPixmap needle;
    needle.load(":/image/needle.png");
    painter.rotate(value-135);
    painter.drawPixmap(-needle.width()/2, -needle.height(), needle); // 繪制指針,默認圖片針尖在上坐標(0,0),所以移動使針尾坐標為0

    painter.rotate(-(value-135)); // 恢復旋轉,繪制蒙版層
    QPixmap overlay = QPixmap(":/image/overlay.png");
    painter.drawPixmap(-img.width()/2 + 25, -img.height()/2 + 25, overlay);

    painter.restore();
}

void Dial::valueChanged(int value)
{
    this->value = 2.7*value;
    update();
}

第四步:調用dial類,把寫好的類當做一個控件來使用即可,連接dial的槽函數即可控制表盤。

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    this->setStyleSheet("QWidget { background-color:rgb(84, 84, 84); }");
    QVBoxLayout *layout = new QVBoxLayout(this);

    slider = new QSlider(Qt::Orientation::Horizontal,this);
    dial = new Dial(this);

    layout->addWidget(dial);
    layout->addWidget(slider);

    connect(slider, &QSlider::valueChanged, dial, &Dial::valueChanged);
}

3、實現效果

 

動效圖:

4、參考資料

qt 原廠demo ,本文只是使用了其資源文件,免得自己找圖片。

歡迎界面搜索dial,自帶UI Compontents:Dial Control Example。

 


 

 尊重技術文章,轉載請注明!

Qt自定義控件之儀表盤1--簡單的貼圖儀表盤

https://www.cnblogs.com/pingwen/p/13395571.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM