Qt实现的简单记账本软件

本文介绍了作者使用Qt库和C++语言开发的一款PC端记账本软件,包括记录每日支出、本地登录功能(数据库的读写)和支出数据的图表化。在开发过程中,作者分享了遇到的数据库问题以及代码组织上的反思,如用户登录状态显示、代码重复和功能不完善等。文章最后提供了GitHub项目链接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

选题:PC端记账本软件

语言:C++

开发工具:Qt库、Qt Creator

其实组里的人都比较懒,做完了之后觉得应该做个游戏什么的比较考验自己的能力,不过做实用的软件也确实比较有意思,为此还买了个机械键盘,感觉有点浪费hhh,下面开始正题了。
软件要实现的几个主要功能

1.记录每日支出

2.实现简单的本地登录功能->即实现数据库的写入与读取

我在这里用的是Qt自带的一个比较简单的QSQLite,有需求的可以上远程服务器,不过我这里还是遇到了一些问题就是在打包之后无法使用数据库,可能是依赖没有添加的原因,由于已经蒙混过关了所以就没有深究这一块的问题。

3.实现支出数据的图表化

注册界面
图表界面

总体看下来个人认为比较繁琐的是数据库的部分,巧的是我之前做的一个项目里有比较接近的模块,所以这部分是我自己来负责的,零零总总还都比较简单,由于队友都不太行hhhh,我也就没想着做拓展功能,谁能想到五个人的团队实际上只有两个人在写代码呢?

bool OpenDateBase();
int main(int argc, char *argv[])
{
    OpenDateBase();
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    return a.exec();
}

可以看到main部分的代码还是比较简单的,大概是实现这么一个逻辑:打开数据库,生成窗口实例,展示窗口最后再让窗口一直显示

bool OpenDateBase(){
    QSqlDatabase mydb=QSqlDatabase::addDatabase("QSQLITE");
    mydb.setDatabaseName("cashitem.db");
    if(mydb.open())
    {
        qDebug()<<"open success";
        QSqlQuery query;
            //新建item表,id设置为主键,一个金额,一个类型,一个内容,一个时间
            query.exec("create table item(id INTEGER PRIMARY KEY AUTOINCREMENT,money int,type varchar,content varchar,addtime time,useraccount varchar)");//条目,即输入的支出数据
            query.exec("create table user(id INTEGER PRIMARY KEY AUTOINCREMENT,useraccount varchar,userpassword varchar,useremail varchar)");//用户信息
            query.exec("create table user_budget_setting(id INTEGER PRIMARY KEY AUTOINCREMENT,useraccount varchar,dayBudget int,monthBudget int,yearBudget int)");//用户的支出与预算表
         return true;
    }
    else
    {
        //给出debug提示,便于定位错误的地点
        qDebug()<<"open failed";
        return false;
    }
}

必须在Qt给出的.pro文件中添加sql,见下文的最后一行

#-------------------------------------------------
#
# Project created by QtCreator 2019-07-03T10:40:19
#
#-------------------------------------------------

QT       += core gui sql charts

这一部分的代码我是根据网上的一篇博客改的,在这里我先创建了一个数据库,若数据库存在那么就会直接调用,这里的数据库使用还是比较轻松的,以前我用服务器的数据库真的是一波三折哈哈哈,而后创建了三张数据表,含义在我给的注释里。

这个主键我也是纠结了很久,我以为给他传一个NULL就好了,后来我发现还不能加‘’单引号确实比较坑爹,详细可以看我后面给出的代码。

接下来是主窗口的代码mainwindow:


MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    tagWidgetLayout.setParent(ui->dailyBoardContent);
    connect(&user_login,&userLoginWindow::loginSuccess,this,&MainWindow::user_login_sucess);
    connect(&itemMark,&itemMark::conveyData,this,&MainWindow::addNewItemLabel);
    ui->edit_pushButton->hide();
    ui->delet_pushButton_2->hide();
    ui->statusBar->hide();
    ui->menuBar->hide();
    ui->mainToolBar->hide();
}

MainWindow::~MainWindow()//主窗口的销毁函数
{
    QSqlQuery query;//建立一个数据库的query
    QString sql1;
    sql1="insert into user_login(id,useraccount)values(NULL,'') ";
    query.exec(sql1);
    query.exec("select  id,useraccount from user_login where id >= 0");
    while (query.next()) {
        QString id = query.value(0).toString();
        useraccount = query.value(1).toString();
        qDebug()<<"mainwindow:"<<id<<useraccount;
    }
    delete ui;
}

void MainWindow::on_addItemButton_clicked()
{
    //ui->tabWidget->hide();
    itemMark.show();
}

void MainWindow::addNewItemLabel(int money ,QString type,QString content){
    newWidget = new itemWidget(money,type,content,ui->itemListWidget);
    QSqlQuery query1;
    query1.exec("select  id,useraccount from user_login where id >= 0");
    while (query1.next()) {
        QString id = query1.value(0).toString();
        useraccount = query1.value(1).toString();
        qDebug()<<id<<useraccount;
    }

    if(content!=NULL){
        QDateTime dtm;
        QString timestr = dtm.currentDateTime().toString("yyyyMMdd");
        QSqlQuery query;//建立一个数据库的query
        QString sql1;
        sql1=QString("insert into item(id, money, type,content,addtime,useraccount) values(NULL,'%1', '%2', '%3','%4','%5')").arg(money).arg(type).arg(content).arg(timestr).arg(useraccount);
        query.exec(sql1);
        qDebug()<<money<<type<<content<<timestr<<useraccount;
        QListWidgetItem *listwidgetitem = new QListWidgetItem(ui->itemListWidget,0);
        listwidgetitem->setSizeHint(QSize(50,50));
        ui->itemListWidget->setItemWidget(listwidgetitem,newWidget);
        ui->itemListWidget->show();
    }

}
void MainWindow::deletItem(){
    QListWidgetItem *listwidgetitem= ui->itemListWidget->currentItem();
    listwidgetitem->setHidden(true);
}

void MainWindow::on_userAvatarPic_clicked()
{
    user_login.show();
}

void MainWindow::on_dailyBoardButton_clicked()
{
    ui->stackedWidget->setCurrentIndex(0);
}

void MainWindow::on_chartAnalysisButton_clicked()
{
    int i = ui->monthSelector->currentIndex();
    chartsMaking(i+1);
    ui->stackedWidget->setCurrentIndex(1);
}

void MainWindow::on_bugetSettingButton_clicked()
{
 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值