qt实用学习案例:数据库设计+图表显示+model-view模式+样式表定制

整理不易,如有帮助,请点赞收藏--------彡皮

一 需求

1,使用MySQL存储数据,合理设计数据内容和存储方式

2,数据展示要基于饼状图、柱状图和折线图,展示的源数据来自数据库,数据内容可自行设计

3,提供tableview等表格显示数据源

4,使用model-view设计模式,使用qss样式表(以加载资源表的方式,方便后续修改界面样式)进行样式设计

5,总代码行不少于2000行

6,整体UI界面需布局合理,用户交互方便

7,在关键处需要有代码注释

二 设计

1,数据库设计:创建一个简单的数据库,用于存储销售数据

2,程序主要功能:连接mysql,实用tableview显示数据,并允许用户增删改查

3,提供三种图表显示:饼状图(显示各产品销售占比)、柱状图(按月展示销售额)、折线图(按月展示销售额趋势)

4,使用MVD(Model-View-Delegate)模式,其中Model使用QSqlTableModel,View使用QTableView,Delegate用于自定义显示或编辑。

5,使用QSS样式表美化界面,并通过资源文件加载。

6,使用QTabWidget将表格和图表放在不同的标签页中,同时提供一些按钮和组合框用于交互(比如选择图表类型、筛选数据等)。

代码结构

三 核心代码

database.cpp

  • 连接数据库
bash 复制代码
    db = QSqlDatabase::addDatabase("QMYSQL");
    db.setHostName("localhost");
    db.setDatabaseName("mysql");
    db.setUserName("root");
    db.setPassword("112233");
bash 复制代码
    if (!db.open()) {
        qDebug() << "Error: Failed to connect to database." << db.lastError();
        connected = false;
        return false;
    }
  • 初始化数据库
bash 复制代码
    // 检查表是否存在,不存在则创建
    createTables();

    // 检查是否有数据,没有则插入示例数据
    QSqlQuery query("SELECT COUNT(*) FROM products");
    if (query.next() && query.value(0).toInt() == 0) {
        insertSampleData();
    }

database.h

bash 复制代码
#ifndef DATABASE_H
#define DATABASE_H

#include <QObject>
#include <QSqlDatabase>
#include <QSqlError>
#include <QSqlQuery>
#include <QDebug>
#include <QSqlQueryModel>

class Database : public QObject
{
    Q_OBJECT
public:
    explicit Database(QObject *parent = nullptr);
    ~Database();

    bool connectToDatabase();
    void initializeDatabase();
    bool isConnected() const;

    // 数据操作接口
    QSqlQueryModel* getSalesData();
    QSqlQueryModel* getProductsData();
    QSqlQueryModel* getRegionsData();
    bool addSaleRecord(const QVariantMap &record);
    bool updateSaleRecord(int id, const QVariantMap &record);
    bool deleteSaleRecord(int id);

private:
    QSqlDatabase db;
    bool connected;

    void createTables();
    void insertSampleData();
};

#endif // DATABASE_H

mainwindow.h

bash 复制代码
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QSqlTableModel>
#include <QChartView>
#include <QBarSeries>
#include <QPieSeries>
#include <QLineSeries>
#include <QValueAxis>
#include <QCategoryAxis>
#include "database.h"
#include <QTreeWidgetItem>
#include <QDateEdit>

QT_CHARTS_USE_NAMESPACE

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private slots:
    void onTreeViewItemClicked(QTreeWidgetItem *item, int column);
    void onAddRecord(bool checked);
    void onDeleteRecord(bool checked);
    void onRefreshData(bool checked);
    void onFilterChanged(const QString &);
    void toggleDarkMode(bool checked);
    void showAboutDialog(bool checked);

    void on_filterComboBox_currentTextChanged(const QString &arg1);


private:
    Ui::MainWindow *ui;
    Database *db;
    QSqlTableModel *salesModel;
    QSqlTableModel *productsModel;
    QSqlTableModel *regionsModel;

    bool darkMode;

    void setupDatabase();
    void setupUI();
    void setupCharts();
    void setupConnections();
    void applyStyleSheet(const QString &styleSheet);

    void showSalesTable();
    void showProductsTable();
    void showRegionsTable();

    void showSalesPieChart();
    void showSalesBarChart();
    void showSalesTrendChart();

    void updateSalesPieChart();
    void updateSalesBarChart();
    void updateSalesTrendChart();
};

#endif // MAINWINDOW_H

四 运行结果

运行视频

源码链接

源码链接

相关推荐
TG:@yunlaoda360 云老大20 小时前
如何在华为云国际站代理商控制台进行基础状态核查的常见问题解答
数据库·华为云·php
FPGAI20 小时前
C++学习之函数
c++·学习
CeshirenTester20 小时前
Cursor自动调试代码实战教程
数据库·oracle
老马952720 小时前
事务工具类
数据库·后端
浪子不回头41520 小时前
推理建模学习笔记
笔记·学习
小张是铁粉20 小时前
oracle 数据库学习之体系结构(1-4章)
数据库·学习
会编程的吕洞宾20 小时前
智能体学习记录二之发展史
学习
代码游侠20 小时前
应用——基于Linux的音乐播放器项目
linux·运维·笔记·学习·算法
TH_120 小时前
22、oracle导入数据,sys_user表数据错误
数据库·oracle
严文文-Chris20 小时前
【向量数据库到底是什么?】
数据库