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

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

介绍

Qt 是一款跨平台的GUI应用开发框架,它有很多成熟的库和工具,同时也提供了对数据库和数据可视化的支持。这里将介绍如何使用 C++ Qt 开发一个历史数据展示的程序。主要涉及到以下三个方面:

  1. 数据库连接与操作
  2. 数据可视化 (Chart)
  3. 图形界面设计 (UI)

在程序中,我们会使用 MySQL 作为数据库的后端。同时,还会用到 Qt 的 QChart 和 QLineSeries 这些类处理和展示数据。

数据库连接与操作

在 Qt 中,可以使用 QtSQL 模块操作各种关系型数据库。这里我们使用 MySQL 作为后端数据库。连接 MySQL 数据库会用到 Qt 提供的 QSqlDatabase,使用示例如下:

QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
db.setHostName("localhost");
db.setDatabaseName("database");
db.setUserName("user");
db.setPassword("password");

if (!db.open()) {
    qDebug() << "Failed to connect to database!";
    return;
}

其中,setHostName()setDatabaseName()setUserName()setPassword() 分别用于设置主机名、数据库名、用户名、密码。如果连接成功,open() 函数将返回 true。

QSqlQuery 是 Qt 提供的查询数据库的类。可以使用它执行 SQL 查询,并获取返回的数据。使用示例如下:

QSqlQuery query;
query.exec("SELECT * FROM table");

while (query.next()) {
    QString column1 = query.value(0).toString();
    QString column2 = query.value(1).toString();
    // ...
}

这里的next()函数则是获取到下一行结果。

数据可视化

要实现历史数据的可视化,我们需要使用 Qt 的 QChart 和 QLineSeries 类。其中,QChart 是一个图表对象,QLineSeries 是一个折线图系列。

以下是使用 QChart 和 QLineSeries 显示历史数据的示例:

QChartView *chartView = new QChartView(this);
chartView->setRenderHint(QPainter::Antialiasing);

QChart *chart = new QChart();
chart->setTitle("Temperature History");
QLineSeries *series = new QLineSeries();

QSqlQuery query;
query.exec("SELECT * FROM temperature_history");

while (query.next()) {
    qint64 timestamp = query.value(0).toLongLong();
    double temperature = query.value(1).toDouble();
    QDateTime datetime;
    datetime.setMSecsSinceEpoch(timestamp);
    series->append(datetime.toMSecsSinceEpoch(), temperature);
}

chart->addSeries(series);
chart->createDefaultAxes();

chartView->setChart(chart);
chartView->setRubberBand(QChartView::HorizontalRubberBand);
chartView->setRenderHint(QPainter::Antialiasing);

图形界面设计

Qt 提供了丰富的 UI 组件用于构建图形界面。我们要实现的界面需要包括一个用于展示历史数据的图表和用于过滤数据的时间范围控件。在代码中,我们可以使用 QChartView、QDateTimeEdit 和 QPushButton 来分别实现这些功能。UI 布局可以由 Qt 的 Designer 工具来完成,也可以手动编写代码。

以下是使用 Designer 工具创建历史数据展示程序的界面的步骤:

  1. 打开 Designer 工具,并新建一个空白窗口。
  2. 在 “Widget Box” 中选择 QChartView、QDateTimeEdit 和 QPushButton,并拖拽到窗口中。
  3. 调整上述组件的大小和位置,使其符合需求。
  4. 在界面右键,选择“Layoout”->“Lay Out in a Grid”,实现组件的网格布局。
  5. 在 “Object Inspector” 中对 QChartView、QDateTimeEdit 和 QPushButton 进行命名,并设置好相应的显示文本。保存 UI 文件。

示例程序如下:

class MainWindow : public QMainWindow {
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr) : QMainWindow(parent) {
        setWindowTitle("Temperature Monitor");

        QWidget *centralWidget = new QWidget;
        setCentralWidget(centralWidget);

        QGridLayout *layout = new QGridLayout(centralWidget);

        QChartView *chartView = new QChartView(this);
        chartView->setRenderHint(QPainter::Antialiasing);
        layout->addWidget(chartView, 0, 1, 1, 1);

        QDateTimeEdit *startTimeEdit = new QDateTimeEdit(this);
        startTimeEdit->setDateTime(QDateTime::currentDateTime().addDays(-1));
        startTimeEdit->setDisplayFormat("yyyy-MM-dd hh:mm:ss");
        layout->addWidget(startTimeEdit, 1, 0, 1, 1);

        QDateTimeEdit *endTimeEdit = new QDateTimeEdit(this);
        endTimeEdit->setDateTime(QDateTime::currentDateTime());
        endTimeEdit->setDisplayFormat("yyyy-MM-dd hh:mm:ss");
        layout->addWidget(endTimeEdit, 1, 1, 1, 1);

        QPushButton *searchButton = new QPushButton("Search");
        layout->addWidget(searchButton, 1, 2, 1, 1);

        QChart *chart = new QChart();
        chart->setTitle("Temperature History");
        QLineSeries *series = new QLineSeries();
        chart->addSeries(series);
        chart->createDefaultAxes();
        chartView->setChart(chart);

        connect(searchButton, &QPushButton::clicked, [this, series, startTimeEdit, endTimeEdit]() {
            series->clear();

            QSqlQuery query;
            query.prepare("SELECT * FROM temperature_history WHERE timestamp >= ? AND timestamp <= ?");
            query.bindValue(0, startTimeEdit->dateTime().toMSecsSinceEpoch());
            query.bindValue(1, endTimeEdit->dateTime().toMSecsSinceEpoch());
            query.exec();

            while (query.next()) {
                qint64 timestamp = query.value(0).toLongLong();
                double temperature = query.value(1).toDouble();
                QDateTime datetime;
                datetime.setMSecsSinceEpoch(timestamp);
                series->append(datetime.toMSecsSinceEpoch(), temperature);
            }
        });
    }
};

示例

下面以绘制线性函数为例,演示使用 Qt 连接 MySQL 数据库和展示历史数据的完整流程。

使用 MySQL 创建一个名为 test 的数据库,并在其中新建一个名为 line_data 的表,字段如下:

id x y
1 0 1
2 1 3
3 2 5
4 3 7
5 4 9

在 Qt 项目中创建一个 MainWindow 类,并添加上述代码。在 MainWindow::MainWindow() 中,使用以下代码连接数据库并查询数据:

QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
db.setHostName("localhost");
db.setDatabaseName("test");
db.setUserName("root");
db.setPassword("password");

if (!db.open()) {
    qDebug() << "Failed to connect to database!";
    return;
}

QSqlQuery query;
query.exec("SELECT * FROM line_data");

QChart *chart = new QChart;
chart->setTitle("Line Data");

QLineSeries *series = new QLineSeries;

while (query.next()) {
    series->append(query.value("x").toDouble(), query.value("y").toDouble());
}

chart->addSeries(series);
chart->createDefaultAxes();
chart->legend()->setVisible(true);
chart->legend()->setAlignment(Qt::AlignBottom);

QChartView *chartView = new QChartView(chart);
chartView->setRenderHint(QPainter::Antialiasing);
setCentralWidget(chartView);

编译运行项目,可以看到输出了包含数据的线性函数图表。

接下来我们继续演示如何查询并显示历史数据。在 MainWindow 界面构造函数中,将代码更改为:

QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
db.setHostName("localhost");
db.setDatabaseName("test");
db.setUserName("root");
db.setPassword("password");

if (!db.open()) {
    qDebug() << "Failed to connect to database!";
    return;
}

QWidget *centralWidget = new QWidget;
setCentralWidget(centralWidget);

QGridLayout *layout = new QGridLayout(centralWidget);

QChartView *chartView = new QChartView(this);
chartView->setRenderHint(QPainter::Antialiasing);
layout->addWidget(chartView, 0, 1, 1, 1);

QDateTimeEdit *startTimeEdit = new QDateTimeEdit(this);
startTimeEdit->setDateTime(QDateTime::currentDateTime().addDays(-1));
startTimeEdit->setDisplayFormat("yyyy-MM-dd hh:mm:ss");
layout->addWidget(startTimeEdit, 1, 0, 1, 1);

QDateTimeEdit *endTimeEdit = new QDateTimeEdit(this);
endTimeEdit->setDateTime(QDateTime::currentDateTime());
endTimeEdit->setDisplayFormat("yyyy-MM-dd hh:mm:ss");
layout->addWidget(endTimeEdit, 1, 1, 1, 1);

QPushButton *searchButton = new QPushButton("Search");
layout->addWidget(searchButton, 1, 2, 1, 1);

QChart *chart = new QChart();
chart->setTitle("Line Data");
QLineSeries *series = new QLineSeries();
chart->addSeries(series);
chart->createDefaultAxes();
chartView->setChart(chart);

connect(searchButton, &QPushButton::clicked, [this, series, startTimeEdit, endTimeEdit]() {
    series->clear();

    QSqlQuery query;
    query.prepare("SELECT * FROM line_data WHERE x >= ? AND x <= ?");
    query.bindValue(0, startTimeEdit->dateTime().toMSecsSinceEpoch() / 1000);
    query.bindValue(1, endTimeEdit->dateTime().toMSecsSinceEpoch() / 1000);
    query.exec();

    while (query.next()) {
        series->append(query.value("x").toDouble(), query.value("y").toDouble());
    }
});

运行程序,可以看到主窗口中已经添加了 startDateEdit、endDateEdit 和 Button 控件,并且正确地绑定了按键事件。优化之后,我们可以筛选出上述表中的 x 在某个时间段内的数据,并绘制饼图。

以上就是 C/C++ Qt 数据库与Chart历史数据展示攻略的完整内容。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C/C++ Qt 数据库与Chart历史数据展示 - Python技术站

(0)
上一篇 2023年5月22日
下一篇 2023年5月22日

相关文章

  • c++ #include是怎么样工作的?

    当我们在编写 C++ 程序时, 有时需要使用其它文件中定义的函数或变量,那么我们就需要使用 #include 语句把这个文件包含进来。在 C++ 中,#include 是一个预处理命令。 下面来详细讲解“C++ #include 是怎么样工作的?”的完整攻略: 1. #include 的作用 include 是 C++ 中的一个预处理命令,用于包含一个文件到…

    C 2023年5月23日
    00
  • 解析Java的Jackson库中Streaming API的使用

    解析Java的Jackson库中Streaming API的使用 简介 Jackson是一种Java库,用于在Java对象和JSON之间进行相互转换。Jackson具有多种API用于读取和编写JSON结构。其中,Jackson Streaming API提供了一种更高效和灵活的方式来解析和生成大型JSON文档。本文将介绍Jackson Streaming A…

    C 2023年5月23日
    00
  • C++实现地铁自动售票系统程序设计

    C++实现地铁自动售票系统程序设计攻略 概述 地铁自动售票系统是一种基于计算机技术的智能化自助售票系统,可以方便快捷地为乘客提供地铁车票的购买、充值、查询、退款等服务。本文主要介绍如何使用C++语言实现地铁自动售票系统的设计以及开发方法。 实现步骤 第一步:确定功能需求 地铁自动售票系统的主要功能包括: 售卖地铁票和充值。要求用户输入选择的地铁线路和数量,然…

    C 2023年5月23日
    00
  • 计算机程序设计并行计算概念及定义全面详解

    “计算机程序设计并行计算概念及定义全面详解”的攻略如下: 什么是并行计算? 在了解并行计算之前,需要先了解串行计算。串行计算是指计算机单个处理器按照预设的顺序执行一系列的计算任务,每个任务必须执行完后才能进行下一个任务,这是一种逐个计算的方式。而并行计算是指通过多个处理器同时执行相互独立的任务,并通过协调来完成计算任务,是一种多任务同时进行的计算方式。相对于…

    C 2023年5月23日
    00
  • QQ飞车TP警告码0 5 540 游戏环境异常解决方法

    QQ飞车TP警告码0 5 540 游戏环境异常解决方法 问题描述 在QQ飞车游戏中,当出现TP警告码0 5 540时,表示游戏环境存在异常,需要进行修复处理。以下是该问题的解决方法。 解决步骤 步骤一:检查电脑配置 首先需要检查电脑配置是否达到了游戏运行要求,包括操作系统版本、CPU、内存等硬件配置,确保满足游戏要求。 步骤二:删除游戏文件 如果电脑配置满足…

    C 2023年5月22日
    00
  • 对C语言中递归算法的深入解析

    对C语言中递归算法的深入解析 什么是递归算法 递归算法是指函数自身调用自身的算法。递归优雅而简洁,但一定要写得正确,否则会造成很多问题。 递归算法的基本原理 递归函数包含两个部分: 基本情况,也称为递归终止条件。它告诉函数何时停止递归。 递推部分,也称为递归体。它包含所有的递归逻辑,将问题逐步分解直至达到基本情况。 递归算法示例说明 示例一:斐波那契数列 i…

    C 2023年5月22日
    00
  • c++中堆栈及创建对象示例代码

    在C++中,堆栈就是一种特定的内存管理方法。通过堆栈,我们可以方便地动态分配内存空间。在C++代码中,堆栈可以使用stack类嵌套类型来定义。下面是一个简单的堆栈示例代码: #include <iostream> #include <stack> using namespace std; int main() { stack<i…

    C 2023年5月22日
    00
  • 基于C++实现的线程休眠代码

    下面是基于C++实现的线程休眠的攻略。 1. 线程休眠简介 在C++中,我们可以通过调用线程库的函数来实现线程休眠。线程休眠的作用是使线程在一定的时间内暂停执行,接下来再从停止的地方继续执行。 2. 使用sleep()函数实现线程休眠 C++中的线程库中提供了sleep()函数,其原型如下: #include <unistd.h> unsigne…

    C 2023年5月22日
    00
合作推广
合作推广
分享本页
返回顶部