选题: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()
{