C/C++中Qt数据库与Chart历史数据展示的示例分析
发表于:2026-11-04 作者:千家信息网编辑
千家信息网最后更新 2026年11月04日,这篇文章主要为大家展示了"C/C++中Qt数据库与Chart历史数据展示的示例分析",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"C/C++中Qt数据库与C
千家信息网最后更新 2026年11月04日C/C++中Qt数据库与Chart历史数据展示的示例分析
这篇文章主要为大家展示了"C/C++中Qt数据库与Chart历史数据展示的示例分析",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"C/C++中Qt数据库与Chart历史数据展示的示例分析"这篇文章吧。
在前面的博文中具体介绍了QChart组件是如何绘制各种通用的二维图形的,本章内容将继续延申一个新的知识点,通过数据库存储某一段时间节点数据的走向,当用户通过编辑框提交查询记录时,程序自动过滤出该时间节点下所有的数据,并将该数据动态绘制到图形组件内,实现动态查询图形的功能。
首先通过如下代码,创建Times表,表内记录有某个主机某个时间节点下的数值:
#include#include #include #include #include #include #include #include #include #include #include #include // 初始化数据库// https://www.cnblogs.com/lysharkvoid InitSql(){ QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE"); db.setDatabaseName("lyshark.db"); if (!db.open()) { std::cout << db.lastError().text().toStdString()<< std::endl; return; } // 执行SQL创建表 db.exec("DROP TABLE Times"); db.exec("CREATE TABLE Times (" "id INTEGER PRIMARY KEY AUTOINCREMENT, " "address VARCHAR(64) NOT NULL, " "datetime VARCHAR(128) NOT NULL, " "value INTEGER NOT NULL" ")" ); db.commit(); db.close();}int main(int argc, char *argv[]){ QCoreApplication a(argc, argv); InitSql(); return a.exec();}
数据库结构如下:

接着编写一个模拟插入数据的案例,该案例每一秒向数据库内插入一条记录,我们运行一段时间。
#include#include #include #include #include #include #include #include #include #include #include #include // 延时函数void Sleep(int msec){ QTime dieTime = QTime::currentTime().addMSecs(msec); while(QTime::currentTime() < dieTime) QCoreApplication::processEvents(QEventLoop::AllEvents,100);}// 生成随机数int GetRandom(){ int num = qrand() % 100; return num;}// 插入数据void InsertSQL(){ QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE"); db.setDatabaseName("lyshark.db"); if (!db.open()) { std::cout << db.lastError().text().toStdString()<< std::endl; return; } for(int index=0;index <99999;index++) { QString address = QString("192.168.1.100"); QDateTime curDateTime = QDateTime::currentDateTime(); QString date_time = curDateTime.toString("yyyy-MM-dd hh:mm:ss"); int value = GetRandom(); QString run_sql = QString("INSERT INTO Times(id,address,datetime,value) VALUES (%1,'%2','%3',%4);") .arg(index).arg(address).arg(date_time).arg(value); std::cout << "执行插入语句: " << run_sql.toStdString() << std::endl; db.exec(run_sql); db.commit(); Sleep(1000); } db.close();}int main(int argc, char *argv[]){ QCoreApplication a(argc, argv); qsrand(QTime(0,0,0).secsTo(QTime::currentTime())); InsertSQL(); return a.exec();}
运行插入程序,统计一段时间 从 2021-12-11 15:34:16 到 2021-12-11 15:40:04 停止,表内记录如下:

如果我们需要查询某一个时间节点下的数据,例如查询2021-12-11 15:35:00 - 2021-12-11 15:37:00的数据可以这样写SQL:
#include#include #include #include #include #include #include #include #include #include #include #include // 输出数据// https://www.cnblogs.com/lysharkvoid SelectSQL(){ QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE"); db.setDatabaseName("lyshark.db"); if (!db.open()) { std::cout << db.lastError().text().toStdString()<< std::endl; return; } // 查询数据 QSqlQuery query("SELECT * FROM Times;",db); QSqlRecord rec = query.record(); // 循环所有记录 while(query.next()) { // 判断当前记录是否有效 if(query.isValid()) { int id_value = query.value(rec.indexOf("id")).toInt(); QString address_value = query.value(rec.indexOf("address")).toString(); QString date_time = query.value(rec.indexOf("datetime")).toString(); int this_value = query.value(rec.indexOf("value")).toInt(); if(date_time.toStdString() >= "2021-12-11 15:35:00" && date_time.toStdString() <="2021-12-11 15:37:00") { std::cout << "value: " << this_value << std::endl; } } }}int main(int argc, char *argv[]){ QCoreApplication a(argc, argv); SelectSQL(); return a.exec();}
这样就可以将该区间内所有的数据全部过滤出来了:
将过滤参数与QChart组件结合即可实现动态绘图效果,绘制UI界面如下:
当用户点击查询时,直接从数据库内取出数据,并将其动态更新到Chart组件内即可,实现代码如下:
#include#include #include #include #include #include #include #include #include #include #include // 初始化Chart图表void MainWindow::InitChart(){ // 创建图表的各个部件 QChart *chart = new QChart(); // 将Chart添加到ChartView ui->graphicsView->setChart(chart); ui->graphicsView->setRenderHint(QPainter::Antialiasing); // 隐藏图例 chart->legend()->hide(); // 设置图表主题色 ui->graphicsView->chart()->setTheme(QChart::ChartTheme(1)); // 创建曲线序列 QLineSeries *series0 = new QLineSeries(); // 序列添加到图表 chart->addSeries(series0); // 创建坐标轴 QValueAxis *axisX = new QValueAxis; // X轴 axisX->setRange(1, 100); // 设置坐标轴范围 axisX->setLabelFormat("%d %"); // 设置X轴格式 axisX->setMinorTickCount(5); // 设置X轴刻度 QValueAxis *axisY = new QValueAxis; // Y轴 axisY->setRange(0, 100); // Y轴范围 axisY->setMinorTickCount(4); // s设置Y轴刻度 // 设置X于Y轴数据集 chart->setAxisX(axisX, series0); // 为序列设置坐标轴 chart->setAxisY(axisY, series0);}// 为序列生成数据void MainWindow::SetData(){ // 获取指针 QLineSeries *series0=(QLineSeries *)ui->graphicsView->chart()->series().at(0); // 清空图例 series0->clear(); // 链接数据库 QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE"); db.setDatabaseName("lyshark.db"); if (!db.open()) { return; } // 查询数据 QSqlQuery query("SELECT * FROM Times;",db); QSqlRecord rec = query.record(); // 赋予数据 qreal t=0,intv=1; // 循环所有记录 while(query.next()) { // 判断当前记录是否有效 // https://www.cnblogs.com/lyshark if(query.isValid()) { QString address_value = query.value(rec.indexOf("address")).toString(); QString date_time = query.value(rec.indexOf("datetime")).toString(); int this_value = query.value(rec.indexOf("value")).toInt(); // 获取组件字符串 QString start_user_time = ui->dateTimeEdit_Start->text(); QString end_user_time = ui->dateTimeEdit_End->text(); // 将时间字符串转为秒,并计算差值 (秒为单位) QDateTime start_timet = QDateTime::fromString(start_user_time, "yyyy-MM-dd hh:mm:ss"); QDateTime end_timet = QDateTime::fromString(end_user_time, "yyyy-MM-dd hh:mm:ss"); uint stime = start_timet.toTime_t(); uint etime = end_timet.toTime_t(); // 只允许查询小于180秒的记录 uint sub_time = etime - stime; if(sub_time <= 180) { // 查询指定区间内的数据 if(date_time.toStdString() >= start_user_time.toStdString() && date_time.toStdString() <= end_user_time.toStdString()) { // std::cout << "区间内的数据: " << this_value << std::endl; series0->append(t,this_value); t+=intv; } } else { std::cout << "查询范围超出定义." << std::endl; return; } } }}// 将添加的widget控件件提升为QChartView类MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow){ ui->setupUi(this); InitChart(); // 初始化时间组件 QDateTime curDateTime = QDateTime::currentDateTime(); // 设置当前时间 ui->dateTimeEdit_Start->setDateTime(curDateTime); ui->dateTimeEdit_End->setDateTime(curDateTime); // 设置时间格式 ui->dateTimeEdit_Start->setDisplayFormat("yyyy-MM-dd hh:mm:ss"); ui->dateTimeEdit_End->setDisplayFormat("yyyy-MM-dd hh:mm:ss");}MainWindow::~MainWindow(){ delete ui;}void MainWindow::on_pushButton_clicked(){ SetData();}
查询效果如下所示:
以上是"C/C++中Qt数据库与Chart历史数据展示的示例分析"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!
数据
时间
数据库
查询
组件
内容
动态
图表
序列
节点
历史
历史数据
示例
分析
图形
坐标
坐标轴
篇文章
范围
代码
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
互联网与科技
互联网科技公司排名
苏州找大状互联网科技有限公司
港股互联网科技股
北京互联网科技公司
深圳互联网络科技有限公司
世界互联网领先科技成果
鑫亿盛互联网科技
奇酷互联网络科技公司
汇久创客互联网科技
互联网科技上市公司
沃里互联网科技
科技类的互联网平台
金融科技和互联网金融
卫星互联网科技股票
互联网实体化科技化
互联网企业和科技型企业
辽宁互联网新科技
互联网行业科技股
易租星互联网科技有限公司
互联网科技股
重庆互联网络科技
互联网科技公司怎么样
互联网科技媒体
盛创互联网科技有限公司
济南华为互联网科技产业总部基地
搜狐科技互联网
互联网时代科技型公司的机会
长沙易易互联网科技有限公司
承德科技产业互联网平台