考试界面需求分析
考试用时 考试题库 答题卡 提交试卷
具体实现
构建窗体
在正式编写之前先对构造函数进行一个优化。
编写代码
ExamDialog(QWidget *parent = 0);
ExamDialog::ExamDialog(QWidget *parent):QDialog(parent) { }
快速在源文件中添加定义小技巧
代码实现
examdialog.h
//examdialog.h #ifndef EXAMDIALOG_H #define EXAMDIALOG_H #include<QDialog> #include<QTimer> class ExamDialog : public QDialog { //因为我们后期需要使用到 信号与槽机制,所以添加如下代码 Q_OBJECT public: ExamDialog(QWidget *parent = 0); //正式编写代码了: Qt 命名规则,数据成员一般以 m_开头。类名首写字母以大写字母开头。成员方法一般以小写字母开头。 void initTimer(); //初始化计时器 //刷新考试时间:思路:使用QT自带的计时器 QTimer *m_timer; //计时器 int m_timeGo; // private slots: void freshTime(); //添加私有的一个槽方法 }; #endif // EXAMDIALOG_H
examdialog.cpp
//examdialog.cpp #include "examdialog.h" ExamDialog::ExamDialog(QWidget *parent):QDialog(parent) { // 调用初始化计时器 initTimer(); } void ExamDialog::initTimer() { m_timeGo = 0; //开始的考试时间为0 m_timer = new QTimer(this); m_timer->setInterval(1000); //设置一秒钟触发一次 m_timer->start();//启动计时器 //我们想要做得事情是:刷新这个考试窗口用时。//让两者联系起来,也即信号与槽。 //参数一:发送信号的对象 参数二:发送什么信号、参数三:响应信号的对象 参数四:执行的槽方法 connect(m_timer,SIGNAL(timeout()),this,SLOT(freshTime())); // timeout()是系统自带的,freshTime()需要自己写。 //去头文件examdialog.h 添加 相应的槽方法 } void ExamDialog::freshTime() //添加私有的一个槽方法 { //刷新考试用时 m_timeGo++; //每一调用刷新窗口的方法都代表有一秒钟过去了,所以我们的考试用时每次都要+1 //计算时间,为了设置标题显示 QString min = QString::number( m_timeGo/60);//number() 方法会将计算的数字转换成 QString字符串格式 QString sec = QString::number( m_timeGo%60); setWindowTitle("考试已用时:"+min+"分"+sec+"秒");//设置窗口标题:多少分多少秒 }
省略登录界面
因为本项目重点是考试时间,所以在使用登录界面就会略显繁琐了,估将登录界面注释掉,换成考试时间界面。
main.cpp
//main.cpp #include "logindialog.h" #include <QApplication> #include"examdialog.h" int main(int argc, char *argv[])//程序的入口函数 { #if (QT_VERSION >= QT_VERSION_CHECK(5,9,0)) QApplication::setAttribute(Qt::AA_EnableHighDpiScaling); #endif QApplication a(argc, argv);//应用程序类,建立了一个对象a //为了方便调试所以将登录界面注释掉,换成新的 // LoginDialog w; //w对象就是登录窗口对象 // w.show(); //show方法就是对象框显示出来的功能。 //显示本次的考试窗口 ExamDialog w; w.show(); return a.exec(); //exec的作用就是使对象进入消息循环类似于下面的例子。 /* * 死循环让程序一直运行,生命循环,消息循环 * while(1) * { * if(点击x按钮) * break; * if(点击了最小化按钮) * 最小化动作; * ... * } * */ }
测试结果
可以看到一开始显示的并不是 考试时间,后面才显示的考试时间。故对此进行优化。
优化界面
//优化代码:让界面不在那么突兀 setWindowTitle("考试已用时:0分0秒");
最终代码
//examdialog.cpp #include "examdialog.h" ExamDialog::ExamDialog(QWidget *parent):QDialog(parent) { //优化代码:让界面不在那么突兀 setWindowTitle("考试已用时:0分0秒"); // 调用初始化计时器 initTimer(); } void ExamDialog::initTimer() { m_timeGo = 0; //开始的考试时间为0 m_timer = new QTimer(this); m_timer->setInterval(1000); //设置一秒钟触发一次 m_timer->start();//启动计时器 //我们想要做得事情是:刷新这个考试窗口用时。//让两者联系起来,也即信号与槽。 //参数一:发送信号的对象 参数二:发送什么信号、参数三:响应信号的对象 参数四:执行的槽方法 connect(m_timer,SIGNAL(timeout()),this,SLOT(freshTime())); // timeout()是系统自带的,freshTime()需要自己写。 //去头文件examdialog.h 添加 相应的槽方法 } void ExamDialog::freshTime() //添加私有的一个槽方法 { //刷新考试用时 m_timeGo++; //每一调用刷新窗口的方法都代表有一秒钟过去了,所以我们的考试用时每次都要+1 //计算时间,为了设置标题显示 QString min = QString::number( m_timeGo/60);//number() 方法会将计算的数字转换成 QString字符串格式 QString sec = QString::number( m_timeGo%60); setWindowTitle("考试已用时:"+min+"分"+sec+"秒");//设置窗口标题:多少分多少秒 }
下一篇预告
驾校科目一考试系统——布局题库