首页 > 作文

C/C++ Qt 数据库与Chart历史数据展示

更新时间:2023-04-04 02:16:25 阅读: 评论:0

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

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

#include <qcoreapplication>#include <qsqldataba>#include <qsqlerror>#include <qsqlquery>#include <qsqlrecord>#include <iostream>#include <qstringlist>#include <qstring>#include <qvariant>#include <qdebug>#include <qdatetime>#include <qtime>// 初始化数据库// /d/file/titlepic/lysharkvoid initsql(){    qsqldataba db = qsqldataba::adddataba("qsqlite");    db.tdatabaname("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.clo();}int main(int argc, char *argv[]){    qcoreapplication a(argc, argv);    initsql();    return a.exec();}

数据库结构如下:

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

#include <qcoreapplication>#include <qsqldataba>#include <qsqlerror>#include <qsqlquery>#include <qsqlrecord>#include <iostream>#include <qstringlist>#include <qstring>#include <qvariant>#include <qdebug>#include <qdatetime>#include <qtime>// 延时函数void sleep(int mc){    qtime dietime = qtime::currenttime().addmcs(mc);    while(qtime::currenttime() < dietime)        qcoreapplication::procesvents(qeventloop::allevents,100);}// 生成随机数int getrandom(){    int num = qrand() % 100;    return num;}// 插入数据void inrtsql(){    qsqldataba db = qsqldataba::adddataba("qsqlite");    db.tdatabaname("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("inrt 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.clo();}int ma你我走过的日子in(int argc, char *argv[]){    qcoreapplication a(argc, argv);    qsrand(qtime(0,0,0).csto(qtime::currenttime()));    inrtsql();    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 <qcoreapplication>#include <qsqldataba>#include <qsqlerror>#include <qsqlquery>#include <qsqlrecord>#include <iostream>#include <qstringlist>#include <qstring>#include <qvariant>#include <qdebug>#include <qdatetime>#include <qtime>// 输出数据// /d/file/titlepic/lysharkvoid lectsql(){    qsqldataba db = qsqldataba::adddataba("qsqlite");    db.tdatabaname("lyshark.db");     if (!db.open())     {            std::cout << db.lasterror().text().tostdstring()<< std::endl;            return;     }    // 查询数据    qsqlquery query("lect * 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);    lectsql();    return a.exec();}

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

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

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

#include <qsqldataba>#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->tchart(chart);    ui->graphicsview->trenderhint(qpainter::antialiasing);    // 隐藏图例    chart->legend()->hide();    // 设置图表主题色    ui->graphicsview->chart()->ttheme(qchart::charttheme(1));    // 创建曲线序列    qlineries *ries0 = new qlineries();    // 序列添加到图表    chart->addries(ries0);    // 创建坐标轴    qvalueaxis *axisx = new qvalueaxis;    // x轴    axisx->trange(1, 100);               // 设置坐标轴范围    axisx行政是干嘛的->tlabelformat("%d %");         // 设置x轴格式    axisx->tminortickcount(5);           // 设置x轴刻度    qvalueaxis *axisy = new qvalueaxis;    // y轴    axisy->trange(0, 100);               // y轴范围    axisy->tminortickcount(4);           // s设置y轴刻度    // 设置x于y轴数据集    chart->taxisx(axisx, ries0);   // 为序列设置坐标轴    chart->taxisy(axisy, ries0);}// 为序列生成数据void mainwindow::tdata(){    // 获取指针    qlineries *ries0=(qlineries *)ui->graphicsview->chart()->ries().at(0);    // 清空图例    ries0->clear();    // 链接数据库    qsqldataba db = qsqldataba::adddataba("qsqlite");    db.tdatabaname教育培训机构排名("lyshark.db");    if (!db.open())    {        return;    }    // 查询数据    qsqlquery query("lect * from times;",db);    qsqlrecord rec = query.record();    // 赋予数据    qreal t=0,intv=1;    // 循环所有记录    while(query.next())    {        // 判断当前记录是否有效        // /d/file/titlepic/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_ur_time = ui->datetimeedit_start-&魔兽世界7 0任务线gt;text();            qstring end_ur_time = ui->datetimeedit_end->text();            // 将时间字符串转为秒,并计算差值 (秒为单位)            qdatetime start_timet = qdatetime::fromstring(start_ur_time, "yyyy-mm-dd hh:mm:ss");            qdatetime end_timet = qdatetime::fromstring(end_ur_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_ur_time.tostdstring() && date_time.tostdstring() <= end_ur_time.tostdstring())                {                    // std::cout << "区间内的数据: " << this_value << std::endl;                    ries0->append(t,this_value);                    t+=intv;                }            }            el            {                std::cout << "查询范围超出定义." << std::endl;                return;            }        }    }}// 将添加的widget控件件提升为qchartview类mainwindow::mainwindow(qwidget *parent) :qmainwindow(parent),ui(new ui::mainwindow){    ui->tupui(this);    initchart();    // 初始化时间组件    qdatetime curdatetime = qdatetime::currentdatetime();    // 设置当前时间    ui->datetimeedit_start->tdatetime(curdatetime);    ui->datetimeedit_end->tdatetime(curdatetime);    // 设置时间格式    ui->datetimeedit_start->tdisplayformat("yyyy-mm-dd hh:mm:ss");    ui->datetimeedit_end->tdisplayformat("yyyy-mm-dd hh:mm:ss");}mainwindow::~mainwindow(){    delete ui;}void mainwindow::on_pushbutton_clicked(){    tdata();}

查询效果如下所示:

以上就是c/c++ qt 数据库与chart历史数据展示的详细内容,更多关于c++ qt的资料请关注www.887551.com其它相关文章!

本文发布于:2023-04-04 02:16:23,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/zuowen/7f194a21bbac754d24b78a16e0f8f4b7.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

本文word下载地址:C/C++ Qt 数据库与Chart历史数据展示.doc

本文 PDF 下载地址:C/C++ Qt 数据库与Chart历史数据展示.pdf

标签:数据   时间   组件   坐标轴
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图