定义一个表盘类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;
}