基于QT(c++)的家庭财务管理系统

本文介绍了基于QT的C++家庭财务管理系统,包括登录管理、管理员窗口、信息录入和普通用户窗口等功能。系统使用QSqlite数据库,实现收支项目的分类记录,并具备密码加密和成员收支情况的月度统计。在设计上,采用了TabWidget和TreeWidget,但存在界面设计和信息传递的改进空间。
摘要由CSDN通过智能技术生成

题目:家庭财务管理系统

前言:

家庭财务管理收支管理是一个家庭日常生活中不可缺少一部分,也是财务管理的重要组成部分。

题目要求:

开发一个家庭财务管理系统,实现家庭财务信息的自动化。

系统主要功能:

1.登陆管理 :可以选一名家庭成员做管理员,普通用户只能查看自己的收支信息。

2. 家庭成员管理:成员的信息:姓名、性别、出身日期、年龄,身高,体重。

3. 收支项目管理可以设置收支项目,修改或者删除。收支项目要求分为两层,比如“车辆维护-保养费”;任意一层次都可作为收支项目记账,用户在不清楚支出是否属于“保养费”的时候,可以选择大类“车辆维护”作为支出项

5.家庭成员收支输出   显示每个成员每月的收支情况(时间、收支种类、金额、经手人)。

6.退出管理  

下面是系统功能示意图:

 

 

 

 

 

 

 

 

系统的设计思路如下:

功能实现一:登录窗口实现

ui界面如下:

 

1.管理员登录

  1. 管理员登录功能实现:在登录窗口类loginDlg定义私有成员:管理员账号与管理员密码,通过
    #include<QSettings>    //Qt提供用于写入注册表的类

    读写注册表。 

  2. 通过lineEdit行编辑输入用户名密码,在代码段中通过管理员登陆的Radio Button是否选中进行判断是否进行管理员登录。

2.管理员密码修改

  1. 通过点击左下角的管理员密码修改按钮进行密码修改(进入密码修改对话框),对话框界面如下:
  2. 2.

 

密码修改对话框具体功能实现在此先不做具体介绍,

注意:此处密码修改需要用到加密算法,这里使用QT提供用于密码加密的类:

#include<QCryptographicHash>    //Qt提供用于加密的类

3.普通用户登录:读取数据库

  1. 基于QSqlite轻量级数据库,未选中管理员登录Radio Button时,默认为普通用户登录。

以下为具体代码:

logindlg.h

#ifndef LOGINDLG_H
#define LOGINDLG_H

#include <QDialog>
#include<QSettings>
#include<QByteArray>
#include<QCryptographicHash>    //Qt提供用于加密的类
#include<QMessageBox>

#include <QTextCodec>       //unicode编码与其他编码转换
#include <QSqlDatabase>     //提供通过连接访问数据库的接口
#include <QSqlQuery>        //sql查询中创建、导航和检索数据所涉及的功能
#include <QTime>
#include <QSqlError>
#include <QDebug>
#include <QSqlDriver>
#include <QSqlRecord>
#include <QLabel>
#include <QDataWidgetMapper>
#include <QTemporaryFile>
#include <QFile>
#include <QByteArray>

#define SUB -1
#define MAIN 1

namespace Ui {
class loginDlg;
}

class loginDlg : public QDialog
{
    Q_OBJECT

public:
    explicit loginDlg(QWidget *parent = nullptr);
    ~loginDlg();
    void setName(QString name)  {Mng_Name = name;}
    void setPswd(QString pswd)  {Mng_Pswd = pswd;}
    bool createConnection();   //创建数据库链接
    bool queryAll(QString name, QString pswd);           //查找数据库
    void SetTabOrder();     //设置tab切换顺序
    int SubOrMain;          //主,从窗口切换标志
    QString NormalUser;                  //普通用户账号
private:
    Ui::loginDlg *ui;
    void readSettings();        //读取设置,注册表
    void writeSettings();       //写入设置,注册表
    int Mng_tryCount = 0;       //试错次数
    QString encrypt(const QString& str);    //字符串加密
    QString Mng_Name = "user";           //初始化用户名
    QString Mng_Pswd = "123456";         //初始化密码
    QSqlDatabase DB;


private slots:
    void on_LoginPushButton_clicked();
    void on_SignOutPushButton_clicked();
    void ChangePwd();        //修改密码
    void on_radioButton_clicked();
};

#endif // LOGINDLG_H

logindlg.cpp

#include "logindlg.h"
#include "ui_logindlg.h"

loginDlg::loginDlg(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::loginDlg)
{
    ui->setupUi(this);
    this->setWindowTitle("登陆窗口");
    this->setAttribute(Qt::WA_DeleteOnClose);
//    Mng_Pswd = encrypt("123456");
//    writeSettings();
    SetTabOrder();
    readSettings(); //初始化注册管理员用户名和密码
    createConnection();
    connect(ui->ChangePswd_PB, SIGNAL(clicked()), this, SLOT(ChangePwd()));
}

loginDlg::~loginDlg()
{
    delete ui;
}

bool loginDlg::createConnection()
{
    DB = QSqlDatabase::addDatabase("QSQLITE"); //添加 SQL LITE数据库驱动
    DB.setDatabaseName("../familyDb.db");
    if (!DB.open())   //打开数据库
    {
        QMessageBox::warning(this, "错误", "打开数据库失败",
                            QMessageBox::Ok,QMessageBox::NoButton);
        return false;
    }
    return true;
}

bool loginDlg::queryAll(QString name, QString pswd)
{
    DB = QSqlDatabase::database();      //使用默认连接
    QSqlQuery query(DB);
    query.exec("select * from familyBase");
    while(query.next())
    {
        if(query.value(6).toString()==name&&query.value(7).toString()==pswd)
            return true;
    }
    return false;
}

void loginDlg::SetTabOrder()
{
    setTabOrder(ui->IDLineEdit, ui->PassWordLineEdit);
    setTabOrder(ui->PassWordLineEdit, ui->LoginPushButton);
    setTabOrder(ui->LoginPushButton, ui->SignOutPushButton);
    setTabOrder(ui->SignOutPushButton, ui->radioButton);
    setTabOrder(ui->radioButton, ui->ChangePswd_PB);
    setTabOrder(ui->ChangePswd_PB, ui->radioButton);
}

void loginDlg::readSettings()
{//读取存储的用户名和密码, 密码是经过加密的
    QString organization = "TJJ-Qt";      //用于注册表
    QString appName = "FIO_System";       //app名字
    QSettings settings(organization, appName);
    Mng_Name = settings.value("Username","user").toString();
    QString defaultPSWD = encrypt("123456");        //缺省密码“123456”加密后的数据
    Mng_Pswd = settings.value("PSWD", defaultPSWD).toString();  //读取PSWD
}

void loginDlg::writeSettings()
{//保存用户名,密码等设置
    QSettings settings("TJJ-Qt", "FIO_System");      //注册表键组
    settings.setValue("Username",Mng_Name);          //将管理员账号存至设置
    settings.setValue("PSWD",Mng_Pswd);              //将管理员密码存至设置
    //指向的注册表目录是HKEY_CURRENT_USER/Software/TJJ-Qt/家庭收支管理系统
}

QString loginDlg::encrypt(const QString &str)
{ //字符串MD5算法加密
    QByteArray btArray;

    btArray.append(str);//加入原始字符串

    QCryptographicHash hash(QCryptographicHash::Md5);  //Md5加密算法

    hash.addData(btArray);  //添加数据到加密哈希值

    QByteArray resultArray =hash.result();  //返回最终的哈希值

    QString md5 =resultArray.toHex();//转换为16进制字符串

    return  md5;
}

void loginDlg::on_LoginPushButton_clicked()
{
    QString user = ui->IDLineEdit->text().trimmed();        //输入用户名
    QString pswd = ui->PassWordLineEdit->text().trimmed();  //输入密码

    QString encrptPSWD = encrypt(pswd);                     //对输入密码进行加密
    if(ui->radioButton->isChecked())
    {
        if ((user == Mng_Name)&&(encrptPSWD == Mng_Pswd))       //如果用户名和密码正确
        {
            writeSettings();  //保存设置
            SubOrMain = MAIN;
            this->accept();  //对话框accept(),关闭对话框
        }
        else
        {
            Mng_tryCount++; //错误次数
            if (Mng_tryCount>3)
            {
                QMessageBox::critical(this, "提示", "已达最大试错次数,程序退出");
                exit(1);
            }
            else
            {
                QMessageBox::warning(this, "错误提示", "用户名或密码错误");
                return;
            }
        }
    }
    else
    {
        if(queryAll(user,pswd))
        {
            
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值