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

四 运行结果

运行视频

源码链接

源码链接

相关推荐
江公望5 小时前
Qt qmlplugindump浅谈
开发语言·qt·qml
曦樂~5 小时前
【Qt】文件操作/事件--mainwindow做编辑器
开发语言·qt
宫瑾6 小时前
STM32USB学习
stm32·嵌入式硬件·学习
CS Beginner6 小时前
【JavaWeb学习】myabtis.xml一次性加载mapper相关的文件
xml·学习
矢志航天的阿洪6 小时前
用TikZ绘制专业流程图:从入门到进阶(基于D3QN训练流程)
学习
码出钞能力6 小时前
如何屏蔽GORM个别sql的日志
数据库·sql·gorm
TDengine (老段)6 小时前
TDengine 数字函数 RADIANS 用户手册
大数据·数据库·sql·物联网·时序数据库·tdengine·涛思数据
小蒜学长6 小时前
springboot基于JAVA的二手书籍交易系统的设计与实现(代码+数据库+LW)
java·数据库·spring boot·后端
一只侯子7 小时前
Tuning——CC调试(适用高通)
开发语言·图像处理·笔记·学习·算法