十三周周报
——陈长洪
这周我大体任务还是学习Qt。这周我Qt的成果比较大,基本理解了各个窗口之间的关系,并且还将之前写的学生管理系统部分移植到Qt程序中。
周一我学习了Qt中的一些控件,比如按钮(button),输入框(lineEdit),提示框(label)。我还看了选择提示框,但还是没学会怎么使用它。
周二我开始学习布局,毕竟界面好看用起来才舒服。网上教程里有布局管理器的基本使用方法,我按他的代码自己分析了一下,他先创建了一个windows类作文窗口,然后将windows的标题设置为“Enter……”,再创建了两个类,分别是数字框和滑竿框,并用两个信号槽将这两个信号的改变绑在一起,即其中一个改变,另一个也会改变。他将两个值分范围都设置为0,130。接下来他创建了一个横向布局管理器,然后依次将数字框和滑竿加入这个管理器,然后window这个窗口再实现这个布局管理器。

我按他这个自己创建了一个AVBoxLayout类,用来看看竖向布局的结果。我还试着将滑竿的值最大设置成150,数字框的范围不变。然后我发现,数字框输不到150,最多只能输入到130,而且输到130了滑竿也不会到头。然后我试着拖滑竿,滑竿可以滑到头,但是超过130以后,数字框就不会改变了。
周三我开始试着用ui界面来设计一个登陆页面,就用我昨天学习到的按钮,输入框,还有提示框来做。
我用那三个控件做了一个简易的登录框,目前我还不知道如何将这些信息传回到主程序,但是先把界面做好就能有一个基本框架了。期间发生了一件很神奇的事:无论我怎么设置界面,有没有中午字符都无法正常加载这些界面,并且一旦调用那些控件,就会发生内存错误。我一开始想的是这些按钮还没对象,但是事实上已经创建了一个ui对象了。我试着将其中的一个按钮赋一个对象,结果界面上出现了一个按钮,但是还是和原来的那个界面没任何关系。肯定是那个界面没有正确的加载到窗口类中。我向李学长询问这个,然后他帮我发现,原来我没有用setupUi这个指令来加载这个窗口。
周四白天我开始学习如何获取窗口控件发出的信息。我从网上知道lineEdit是用text函数来获取信息。但是这获取的是一个QString类,不能直接转换成char型的数组来契合我之前写的那个系统。于是我又从网上知道可以用一个QByteArray类来获取QString的toLatin1,然后就可以用QByteArray的对象的data函数来将值赋给char型数组。
QByteArray ba = ui.id->text().toLatin1();
strcpy(id, ba.data());
周六我开始完成系统的移植和整个系统的框架。我系统里三种用户(教师、学生和管理员)。系统还有权限设定,有些操作只有特定的用户才能操作。我还进行了以前系统的部分重写。
我的系统的基本框架是:
大体框架是第一个窗口为登录窗口,登录成功后,关闭登录窗口,判断用户类别。弹出对应用户的窗口,里面再用控件实现用户的操作。
我在程序执行的开始进行的初始化,从文件中加载学生信息

user类为当前用户,将其置为空,然后再弹出登录窗口



并且通过一个信号槽来获取登录信息,并将登录用户返回到主程序,并且在登录的时候还会记录登录的时间制成日志

登录框我进行了简单的设计,比如将id和password输入框进行了最大长度限制,防止在程序中调用strcpy出现溢出错误。我还设置了密码框输入后会显示为星号,进行了基本的隐藏。

当输入的密码错误的时候,就会情况密码框,然后弹出提示

在登录成功时会记录登录时间,还会发出登录成功的信号出去,还会关掉这个窗口(暂时没发现delete导致意外的错误,但是注定这个不会太安全,以后我还会改进它)。

登录后就会开启一个新的窗口,由于我目前没有制作其他的用户窗口,所以直接打开了学生用户的窗口。

我的想法是,用户每次打开一个,都弹出一个新的子窗口。我打算用QDialog来做这个子窗口。目前我准备实现查找其他学生的功能。点功能按钮后弹出一个子窗口,然后再子窗口里有一个输入框,一个按钮,点击按钮后在系统中搜索这个用户,并依据用户权限输出他的全部或部分基本信息。

之前我总说Qt太难,这个学期肯定做不出来这个系统。事实上,虽然难但是下定决心就一定可以完成这个系统。目前我已经完成了这个系统的框架,后面再重写之前的系统,在慢慢舔砖加瓦就行。加油!
