iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C/C++中Qt数据库与Chart历史数据展示的示例分析
  • 909
分享到

C/C++中Qt数据库与Chart历史数据展示的示例分析

2023-06-25 22:06:23 909人浏览 安东尼
摘要

这篇文章主要为大家展示了“C/C++中Qt数据库与Chart历史数据展示的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“C/c++中Qt数据库与Chart历史数据展示的示例分析”这篇文章

这篇文章主要为大家展示了“C/C++Qt数据库与Chart历史数据展示的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“C/c++中Qt数据库与Chart历史数据展示的示例分析”这篇文章吧。

在前面的博文中具体介绍了QChart组件是如何绘制各种通用的二维图形的,本章内容将继续延申一个新的知识点,通过数据库存储某一段时间节点数据的走向,当用户通过编辑框提交查询记录时,程序自动过滤出该时间节点下所有的数据,并将该数据动态绘制到图形组件内,实现动态查询图形的功能。

首先通过如下代码,创建Times表,表内记录有某个主机某个时间节点下的数值:

#include <QCoreApplication>#include <QsqlDatabase>#include <QSqlError>#include <QSqlQuery>#include <QSqlRecord>#include <iOStream>#include <QStringList>#include <QString>#include <QVariant>#include <QDebug>#include <QDateTime>#include <QTime>// 初始化数据库// 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();}

数据库结构如下:

C/C++中Qt数据库与Chart历史数据展示的示例分析

接着编写一个模拟插入数据的案例,该案例每一秒向数据库内插入一条记录,我们运行一段时间。

#include <QCoreApplication>#include <QSqlDatabase>#include <QSqlError>#include <QSqlQuery>#include <QSqlRecord>#include <iostream>#include <QStringList>#include <QString>#include <QVariant>#include <QDebug>#include <QDateTime>#include <QTime>// 延时函数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 停止,表内记录如下:

C/C++中Qt数据库与Chart历史数据展示的示例分析

如果我们需要查询某一个时间节点下的数据,例如查询2021-12-11 15:35:00 - 2021-12-11 15:37:00的数据可以这样写SQL:

#include <QCoreApplication>#include <QSqlDatabase>#include <QSqlError>#include <QSqlQuery>#include <QSqlRecord>#include <iostream>#include <QStringList>#include <QString>#include <QVariant>#include <QDebug>#include <QDateTime>#include <QTime>// 输出数据// 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();}

这样就可以将该区间内所有的数据全部过滤出来了:

C/C++中Qt数据库与Chart历史数据展示的示例分析

将过滤参数与QChart组件结合即可实现动态绘图效果,绘制UI界面如下:

C/C++中Qt数据库与Chart历史数据展示的示例分析

当用户点击查询时,直接从数据库内取出数据,并将其动态更新到Chart组件内即可,实现代码如下:

#include <QSqlDatabase>#include <QSqlError>#include <QSqlQuery>#include <QSqlRecord>#include <iostream>#include <QStringList>#include <QString>#include <QVariant>#include <QDebug>#include <QDateTime>#include <QTime>// 初始化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历史数据展示的示例分析

以上是“C/C++中Qt数据库与Chart历史数据展示的示例分析”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网其他教程频道!

--结束END--

本文标题: C/C++中Qt数据库与Chart历史数据展示的示例分析

本文链接: https://www.lsjlt.com/news/306365.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • c语言怎么计算字符串长度
    在C语言中,可以使用内置的strlen()函数来计算字符串的长度。该函数位于string.h头文件中。以下是一个示例代码: #inc...
    99+
    2024-05-15
    c语言
  • c语言怎么判断三个数的大小
    可以通过比较三个数之间的大小关系来判断它们的大小。以下是一个示例代码: #include <stdio.h> int ...
    99+
    2024-05-15
    c语言
  • c++排序函数sort怎么使用
    在C++中,使用sort函数对容器中的元素进行排序,可以按照默认的升序排列,也可以自定义排序规则。 下面是一个简单的例子,对一个ve...
    99+
    2024-05-15
    c++
  • c++中string的compare函数怎么使用
    在C++中,可以使用string的compare函数来比较两个string对象的大小。该函数的原型如下: int compare(c...
    99+
    2024-05-15
    c++
  • c++中string的compare函数有什么用
    c++中string的compare函数用于比较两个字符串的大小关系。该函数返回一个整数值,表示两个字符串的比较结果。 具体来说,如...
    99+
    2024-05-15
    c++
  • c++中print函数的功能有哪些
    在C++中,通常使用std::cout来进行输出操作,而不是使用print函数。std::cout是C++标准库中的一个输出流对象,...
    99+
    2024-05-15
    c++
  • c语言数据结构怎么使用
    在C语言中,数据结构可以通过定义结构体来实现。以下是一些常见的数据结构的使用方法示例: 链表: #include <std...
    99+
    2024-05-15
    c语言
  • c++中print函数的用法是什么
    在C++中没有内置的print函数,但可以使用cout来输出内容到控制台。cout是C++标准库中的一个输出流对象,可以使用<...
    99+
    2024-05-15
    c++
  • c++中concept的用法是什么
    在C++20中,Concept是一种新的语言特性,用于定义类型要求和约束。Concept可以被用来约束函数模板、类模板和普通函数的参...
    99+
    2024-05-15
    c++
  • c++中concept的作用是什么
    在C++中,concept的作用是定义一种通用的约束,用于限制模板参数的类型范围。通过使用concept,可以在编译时对模板参数进行...
    99+
    2024-05-15
    c++
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作