Qt学习之表盘类的使用

定义一个表盘类widget_panel
.h文件:

#ifndef WIDGET_PANEL_H
#define WIDGET_PANEL_H

#include <QWidget>
#include <QSqlDatabase>
#include <QSqlError>
#include <QSqlQuery>

class widget_panel:public QWidget
{
    Q_OBJECT

        public:
            widget_panel(QWidget *parent = nullptr);
            ~widget_panel();

            void paintEvent(QPaintEvent *event);
            double output;
            double m_maxValue;
            qreal m_angle;
            QString m_units;
            QString m_title;

        private:
            void drawFrame(QPainter *painter);
            void drawScale(QPainter *painter);
            void drawScaleNum(QPainter *painter);

            void drawPointer(QPainter *painter);
            void drawSpeed(QPainter *painter);

            void drawUnit(QPainter *painter);
            int time_id;
            int status;
            //qreal m_angle;
            QColor m_foreground;

            //int m_maxValue;
            double m_minValue;
            int m_startAngle;
            int m_endAngle;

            int m_scaleMajor;
            int m_scaleMinor;
            double m_value;
            int m_precision;


            QSqlDatabase db; //数据库对象


};

#endif // WIDGET_PANEL_H

.cpp文件

#include "widget_panel.h"

#include <QPainter>
#include <QBrush>
#include <QLabel>
#include <QTimerEvent>
#include <QLinearGradient>
#include <QFont>
#include <QFile>
#include <QDebug>
#include <QtMath>
#include <QWidget>

widget_panel::widget_panel(QWidget *parent)
    : QWidget(parent)
{
    //resize(800, 480);
    m_foreground = Qt::white;

    //output = 0;

    status = 0;

    m_startAngle = 45;
    m_endAngle = 45;

    m_minValue = 0;
    //m_maxValue = 100;
    m_scaleMajor = 10;//分度
    m_scaleMinor = 10;
    //m_units = "ms";
    //m_title = "延时";
    m_precision = 0;
    m_value = 0;

    //m_angle = (qreal)270/(m_maxValue-1);

    time_id = this->startTimer(50);
}

widget_panel::~widget_panel()
{
}

void widget_panel::paintEvent(QPaintEvent *event)
{
    int width=this->width();
    int height=this->height();


    QPainter painter(this);

    painter.translate(width/2, height/2);

    int side = qMin(width, height);
    painter.scale(side / 200.0, side / 200.0);      /* 比例缩放 */

    drawFrame(&painter);

    drawScale(&painter);                                 /* 画刻度线 */

    drawScaleNum(&painter);                          /* 画刻度数值值 */
    drawUnit(&painter);
    drawPointer(&painter);

    drawSpeed(&painter);
}

void widget_panel::drawFrame(QPainter *painter)
{
    painter->save();
    // 半径100
    painter->setPen("white");// 边框

    int radius = 100;

    painter->setBrush(QBrush(QColor(0, 0, 0, 0), Qt::SolidPattern));
    painter->drawArc(-radius, -radius, radius<<1, radius<<1, -135*16, -270*16);

    painter->restore();

}

// 绘制刻度线
void widget_panel::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(m_foreground); //推荐使用第二种方式
    for (int i = 0; i <= steps; i++)
    {
        if (i % m_scaleMinor == 0)//整数刻度显示加粗
        {
            pen.setWidth(1); //设置线宽
            painter->setPen(pen); //使用面向对象的思想,把画笔关联上画家。通过画家画出来

            painter->drawLine(0, 90, 0, 100); //两个参数应该是两个坐标值
        }
        else
        {
           pen.setWidth(0);
           painter->setPen(pen);
           painter->drawLine(0, 95, 0, 100);
        }
       painter->rotate(angleStep);
    }
    painter->restore();
}
// 绘制刻度
void widget_panel::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();
}

void widget_panel::drawPointer(QPainter *painter)
{
    int radius = 100;
    QPoint point[4] = {
        QPoint(0, 10),
        QPoint(-10, 0),
        QPoint(0, -80),
        QPoint(10, 0),
    };

    painter->save();

    QLinearGradient linear;
    linear.setStart(-radius, -radius);
    linear.setFinalStop(radius<<1, radius<<1);
    linear.setColorAt(0, QColor(0, 0, 0, 0));
    linear.setColorAt(1, "white");//扫射面积
    painter->setPen(Qt::NoPen);
    painter->setBrush(linear);
    painter->drawPie(-radius, -radius, radius<<1, radius<<1, 225 * 16, -(m_angle * this->output) * 16);

    painter->restore();

    painter->save();

    painter->setBrush(QBrush("white", Qt::SolidPattern));
    painter->rotate(-135 + this->output * m_angle);
    painter->drawPolygon(point, 4);

    painter->restore();
}

void widget_panel::drawSpeed(QPainter *painter)
{
    painter->save();

    painter->setPen(QColor("white"));
    //  绘制速度
    QFont font("Times", 10, QFont::Bold);
    font.setBold(true);
    font.setPixelSize(46);
    painter->setFont(font);
    painter->drawText(-60, 0, 120, 92, Qt::AlignCenter, QString::number(output,'f', 2));
    painter->restore();
}

void widget_panel::drawUnit(QPainter *painter)
{
    QString str = QString("%1").arg(m_units);
    QFontMetricsF fm(font());
    double w = fm.size(Qt::TextSingleLine,str).width();
    painter->setPen(m_foreground);
    painter->drawText(-w / 2, 82, str);
}





 再mainwindows的ui文件中画钟表时直接添加头文件#include "widget_panel.h"
引用钟表类,数据库读取数据更新到表盘显示上  再ui界面添加layout命名为verticalLayout

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QtCharts>
QString host="localhost";
int port=3306;
QString userName= "root";
QString password="123456";
QString databaseName="mynew";
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    this->setStyleSheet("background-color:rgb(4, 21, 49)");

    db = QSqlDatabase::addDatabase("QMYSQL");
    db.setHostName(host);
    db.setPort(port);
    db.setUserName(userName);
    db.setPassword(password);
    db.setDatabaseName(databaseName);
    if (!db.open()) {
        qDebug() << "数据连接失败!";
    }
    else {
        qDebug() << "数据连接成功";
    }

    QGroupBox* groupBox = new QGroupBox("时延"); // 时延GroupBox_3_1
    groupBox->setFixedSize(QSize(400, 400));

    widget_panel *clock=new widget_panel();
    clock->setFixedSize(QSize(400, 400));

    QVBoxLayout* layout = new QVBoxLayout(); //时延布局(垂直布局)
    layout->addWidget(clock);

    groupBox->setLayout(layout);

    QTimer *t_delay=new QTimer();
    connect(t_delay,&QTimer::timeout, [=](){
        widget_show(clock);
    });
    if(t_delay->isActive())
        t_delay->stop();
    else
        t_delay->start(2000);
    //更新表盘数据
    ui->verticalLayout->addWidget(groupBox);

}


MainWindow::~MainWindow()
{
    delete ui;
}
void MainWindow::widget_show(widget_panel *clock)
{
    QSqlQuery q_status(db);
    q_status.prepare("SELECT * FROM test");
    q_status.setForwardOnly(true);
    q_status.exec(); //运行数据库
    double delay;

    while(q_status.next()) //遍历
    {
        delay=q_status.value("delay").toDouble();
    }
    qDebug()<<delay;

    clock->m_units = "ms";
    clock->m_title = "延时";
    clock->m_maxValue = 200;
    clock->m_angle = (qreal)270/(clock->m_maxValue-1);
    clock->update();
    clock->output = delay;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值