写在前面
我个人是一个比较有情怀的人,就算是手机上的用了很久的app也会产生依赖感,而“吾记”这款app以其简约与文艺在很早之前走入了我的生活。这段时间在学习QT开发,也算是一个巩固C++ 的过程,我想自己动手在win端写一个低配的“吾记”,整个项目目前还处在开发状态,但是大体的框架是有了,主要功能也基本成型了,后期会添加一些个性化功能,本博客持续更新。
开发环境:win10, QT creator, MINGW
开发语言:C++11以上即可
开发基础知识:面向对象
项目github:https://github.com/ZYunfeii/QT
环境变量需要自己配
登陆界面
这块目前内置了三个账号,一个测试账号(debug用),两个用户账号。算是一个较为传统的登陆界面,输入账号密码点击登陆即可,目前还没有开发账号注册功能(因为我是自己用的想着)。
实现方法也挺简单的,两个QStringList对应账号密码,按钮信号槽链接,获取用户名索引,没获取就是没账号,获取了再去验证密码正确与否即可。
主界面
这一部分是用户登陆成功后进入的界面,整体画风不够唯美,需要ui设计师美化hhh。
这一部分主要是一个显示已经写下的日记以及删除日记(右边有小×)。日记包阔内容,时间,当时的字体和字号等。当然还有这个用户的头像…所有的数据都是通过数据库SQLite进行管理和存储,这会在之后介绍。用数据库好处就是下一次登陆所有的数据都在,并且数据库用C++操作起来也挺方便。
新建日记界面
点击主界面右上角得新建按钮即可新建一个日记:
这个编辑页面目前支持字体和字号的调节,当写下今日的快乐亦或是烦恼后,点击右上角的保存,记录下来吧!
刚刚写的日记被自动置顶了,字体字号和编辑的一致。
如果你对过去的自己失望,那么请删除那些时候的自己写下的傻话吧(点击右边红×),数据库同时也会删除这条记录,并且,你再也没有方法恢复它。毕竟,过去永远不会再来,时钟永远不会停摆。
数据库SQLite
QT自带数据库SQLite,使用数据库可别忘了在pro文件加上这么一句:
QT += sql
数据库创建多个表:
//创建n个数据库(n = usernameList.length())
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE",QString("myDiary%1").arg(i));
db.setDatabaseName(QString(".//qtDb%1.db").arg(i));
if( !db.open()) qDebug() << "无法建立数据库连接"; //这个db.open相当关键啊!没这一步后面写数据可失败。
else qDebug()<<"数据库连接成功";
QSqlQuery query(db);
query.exec("create table person (time varchar, diary varchar,family varchar,pointSize varchar)");
db.close();
可别忘了:#include <QSqlQuery> #include <QSqlDatabase>
另外,第一次操作别忘了db.open()
数据库中包含四个信息:时间,日记内容,字体,字号,后续可能会增加。
主界面中链接对应用户的数据库,利用数据库可以完成很多功能,比如那个统计日记条数的功能可以这样实现:
//初始化日记数量并显示在顶部
query.first();
query.previous();
if(query.last())
{
numberOfRows = query.at() + 1;
}
ui->diaryNumLabel->setText(QString("您已累计写下了%1篇日记").arg(numberOfRows));
query就是拿到的数据库“指针”。首先将query移到第一个数据的前一个虚拟位置,然后query.last下去,直到query指向最后一个数,取其索引加1即为数据库总容量。
数据库这方面知识我推几篇博文吧还是:
QT-QSqlQuery类操作SQLite数据库(创建、查询、删除、修改)详解
Qt数据库:(三)利用QSqlQuery类执行SQL语句(一)
Qt之自带的数据库QSQLITE(很具体的一个例子)
Qt学习之路八——利用qt对数据库进行操作
读完基本就能上手,别问,问就是试过!
当然数据库还有很多坑,例如我在利用日期string进行删除时数据库进行对比的是加单引号的string,这个时候这么干:
QString deleteString = QString("%1%2%3").arg("'").arg(time).arg("'");
bool flag = query.exec(QString("DELETE FROM person WHERE time = %1").arg(deleteString));
嘿嘿,小trick…
组合自己的控件
像这样的一个控件是由多个控件做出来的封装控件,具体做法就不再赘述了(提升为 操作),反正面向对象是灵魂。
scrollArea和Layout
这两个空间构成了主界面的主体,scrollArea就像是一个覆盖在桌布上的窗口,理解这句话就理解了这个控件,layout决定了桌布上放的东西的排列规则。这里推一篇博文:
QT的自动滚动区QScrollArea的用法,图文详解
项目未完待续
主界面下面那个白条就是未来拓展功能用的。学习语言还是开发来得有效。
项目已上传至github:https://github.com/ZYunfeii/QT
11月8日:
11月9日:
新增日记记录功能,支持双击弹出日记详情,数据库也连上了:
11月16日:
对登录界面做了一些优化:默认登录名、使用回车键快速登录。并改动了exe可执行程序的图标,目前我已经开始用了嘿嘿,还不错感觉:
11月17日:
针对登录界面用户名和用户密码采用map关联容器重写,针对用户界面增添了多个动画效果:
11月22日:
今天突然冒出了个点子对登录界面做了个功能,当账户和密码输对时加载头像(和qq有点区别)