要求:按照驾校的科目一考试系统来实现项目。
要点:图片存储在数据库中。答题界面的切换;考生的判断等;
功能:在考生登录界面可以根据考试机号和考生身份证号来判断考生是否在本机考试,可以显示考生的答题情况,可以切换题目,随机产生试卷题目等
不足:项目目前做出来比较简陋,不太美观,ui没有做好,还有较多的细节没有处理好
上代码:
examform.c
#include "examform.h"
#include "ui_examform.h"
ExamForm::ExamForm(QWidget *parent) :
QWidget(parent),
ui(new Ui::ExamForm)
{
ui->setupUi(this);
//初始化各界面
lf = new LookForm;
lf->hide();
connect(lf,&LookForm::backfrom,this,&ExamForm::show);
connect(lf,&LookForm::shot,this,&ExamForm::examform_colse);
//打开题库数据库
QSqlDatabase dbp=QSqlDatabase::addDatabase("QSQLITE");//打开本地数据库,或者新建数据库;如果本地存在数据库则直接打开数据库,不存在则创建
dbp.setDatabaseName("System.db");//设置数据库文件名
if(!dbp.open())
{
qDebug()<<"dbp.open() error"<<dbp.lastError().text();
return;
}
qDebug()<<"currentIndex="<<ui->stackedWidget->currentIndex();
#if 0//图形插入
QSqlQuery query;
query = QSqlQuery( dbp );
for(int i=1;i<101;i++)
{
QString topic=QString("图形题第%1题").arg(i);
//题目
qDebug()<<"topic="<<topic;
//答案
QString key;
switch (QRandomGenerator::global()->bounded(0,4)) {
case 0:
key="A";
break;
case 1:
key="B";
break;
case 2:
key="C";
break;
case 3:
key="D";
break;
default:
break;
}
//图形
QString img;
QStringList filename={
"D:/QTC++/System/1.png",
"D:/QTC++/System/2.png",
"D:/QTC++/System/3.png"
};
img=filename.at(QRandomGenerator::global()->bounded(0,3));
QPixmap pix(img);
QByteArray imagedata;
QBuffer buf(&imagedata);
buf.open(QIODevice::WriteOnly);
pix.save(&buf,"PNG");
query.prepare("insert into picture values(:number,:topic,'A','B','C','D',:image,:key)");
query.bindValue( ":number", i );
query.bindValue( ":topic", topic );
query.bindValue( ":image", imagedata );
query.bindValue( ":key", key );
buf.close();
//qDebug()<<"sql="<<query;
if(!query.exec())
{
qDebug()<<"插入失败"<<query.lastError().text();
return;
}
qDebug()<<"插入成功"<< i<<query.lastError().text();
}
#endif
#if 0 //选择题插入
QSqlQuery query;
for(int i=1;i<101;i++)
{
QString topic=QString("选择题第%1题").arg(i);
//题目
qDebug()<<"topic="<<topic;
//答案
QString key;
switch (QRandomGenerator::global()->bounded(0,4)) {
case 0:
key="A";
break;
case 1:
key="B";
break;
case 2:
key="C";
break;
case 3:
key="D";
break;
default:
break;
}
//插入
QString sql=QString("insert into title values('%1','%2','A','B','C','D','%3')")
.arg(i)
.arg(topic)
.arg(key);
qDebug()<<"sql="<<sql;
if(!query.exec(sql))
{
qDebug()<<"插入失败"<<query.lastError().text();
return;
}
qDebug()<<"插入成功"<< i<<query.lastError().text();
}
#endif
#if 0 //判断题插入
QSqlQuery query;
for(int i=1;i<101;i++)
{
QString topic=QString("判断题第%1题").arg(i);
//题目
qDebug()<<"topic="<<topic;
//答案
QString key;
switch (QRandomGenerator::global()->bounded(0,2)) {
case 0:
key="A";
break;
case 1:
key="B";
break;
default:
break;
}
//插入
QString sql=QString("insert into select1 values('%1','%2','对','错','%3')")
.arg(i)
.arg(topic)
.arg(key);
qDebug()<<"sql="<<sql;
if(!query.exec(sql))
{
qDebug()<<"插入失败"<<query.lastError().text();
return;
}
qDebug()<<"插入成功"<< i<<query.lastError().text();
}
#endif
//考试时间
QTimer *tr = new QTimer;
connect(tr,SIGNAL(timeout()),this,SLOT(Change_Label()));
tr->start(1000);
ui->stackedWidget->setCurrentIndex(3);
}
ExamForm::~ExamForm()
{
delete ui;
}
void ExamForm::examform_flag(int f)
{
if(f==0){
flag = true;
}
}
void ExamForm::Change_Label()//考试时间槽函数实现
{
if(flag)
{
if(sec==0)
{
min--;
sec=60;
}
sec--;
QString time=QString("%1:%2")
.arg(min)
.arg(sec);
ui->label_3->setText(time);
}
}
void ExamForm::on_pushButton_2_clicked()
{
if(order<=100)
{
QSqlQuery query;
QSqlQuery query2;
QString select_db;
QString answer;
QString correct_answer;
int num;
if(act_order==order)
{
qDebug()<<"332order="<<order<<"act_order="<<act_order;
int a=QRandomGenerator::global()->bounded(0,3);
switch (a) {//随机题型
case 0:
select_db="title";
break;
case 1:
select_db="select1";
break;
case 2:
select_db="picture";
break;
default:
break;
}
if(a<2)
num=QRandomGenerator::global()->bounded(1,100);//随机题号
else
num=QRandomGenerator::global()->bounded(1,51);//随机题号
QString sql_upper = QString("insert into upper values('%1','%2','%3')")//保存到答过的题
.arg(order)
.arg(select_db)
.arg(num);
if(!query2.exec(sql_upper))
{
qDebug()<<"保存失败"<<query.lastError().text();
return;
}
QString sql=QString("SELECT * FROM %1 WHERE number='%2'")
.arg(select_db)
.arg(num);
if(query.exec(sql))
{
ui->stackedWidget->setCurrentIndex(a);//切换界面
if(query.next())
{
if(a==0)
{
ui->label->setText(query.value(1).toString());
ui->radioButton->setText(query.value(2).toString());
ui->radioButton_3->setText(query.value(3).toString());
ui->radioButton_2->setText(query.value(4).toString());
ui->radioButton_4->setText(query.value(5).toString());
//正确答案
correct_answer=query.value(6).toString();
//用户选择的答案
if(ui->radioButton->isChecked()==1)
answer="A";
else if(ui->radioButton_3->isChecked()==1)
answer="B";
else if(ui->radioButton_2->isChecked()==1)
answer="C";
else if(ui->radioButton_4->isChecked()==1)
answer="D";
}else if (a==1) {
ui->label_6->setText(query.value(1).toString());
ui->radioButton_9->setText(query.value(2).toString());
ui->radioButton_10->setText(query.value(3).toString());
correct_answer=query.value(4).toString();
if(ui->radioButton_9->isChecked()==1)
answer="A";
else if(ui->radioButton_10->isChecked()==1)
answer="B";
}else if (a==2) {
ui->label_4->setText(query.value(1).toString());
QByteArray imgdata=query.value(6).toByteArray();
QPixmap pix;
pix.loadFromData(imgdata);
ui->label_5->setPixmap(pix);
ui->radioButton_5->setText(query.value(2).toString());
ui->radioButton_7->setText(query.value(3).toString());
ui->radioButton_6->setText(query.value(4).toString());
ui->radioButton_8->setText(query.value(5).toString());
correct_answer=query.value(7).toString();
if(ui->radioButton->isChecked()==1)
answer="A";
else if(ui->radioButton_3->isChecked()==1)
answer="B";
else if(ui->radioButton_2->isChecked()==1)
answer="C";
else if(ui->radioButton_4->isChecked()==1)
answer="D";
}
}
int socre=0;
if(answer.compare(correct_answer)==0)
socre=2;
query.clear();
query.prepare("insert into answer values(:number,:user_answer,:correct_answer,:socre)");
query.bindValue(":number",order);
query.bindValue(":user_answer",answer);
query.bindValue(":correct_answer",correct_answer);
query.bindValue(":socre",socre);
if(!query.exec())
{
qDebug()<<"录入失败"<<query.lastError().text();
}else{
qDebug()<<"437录入成功"<<"number="<<order;
lf->Answers_Look(order);
}
qDebug()<<"443order="<<order;
order++;
act_order++;
qDebug()<<"445order="<<order;
}
}else
{
QString sql= QString("SELECT * FROM upper WHERE order_upper='%1'").arg(act_order);
if(!query2.exec(sql))
{
qDebug()<<"act_order读取失败"<<query.lastError().text();
return;
}
QString types;
int number;
if(query2.next())
{
types=query2.value(1).toString();
number = query2.value(2).toInt();
}
sql.clear();
sql=QString("SELECT * FROM %1 WHERE number='%2'")
.arg(types)
.arg(number);
if(query.exec(sql))
{
int a;
if(types.compare("title")==0)
a=0;
else if(types.compare("select1")==0)
a=1;
else
a=2;
ui->stackedWidget->setCurrentIndex(a);//切换界面
while(query.next())
{
if(a==0)
{
ui->label->setText(query.value(1).toString());
ui->radioButton->setText(query.value(2).toString());
ui->radioButton_3->setText(query.value(3).toString());
ui->radioButton_2->setText(query.value(4).toString());
ui->radioButton_4->setText(query.value(5).toString());
//正确答案
correct_answer=query.value(6).toString();
//用户选择的答案
if(ui->radioButton->isChecked()==1)
answer="A";
else if(ui->radioButton_3->isChecked()==1)
answer="B";
else if(ui->radioButton_2->isChecked()==1)
answer="C";
else if(ui->radioButton_4->isChecked()==1)
answer="D";
}else if (a==1) {
ui->label_6->setText(query.value(1).toString());
ui->radioButton_9->setText(query.value(2).toString());
ui->radioButton_10->setText(query.value(3).toString());
correct_answer=query.value(4).toString();
if(ui->radioButton_9->isChecked()==1)
answer="A";
else if(ui->radioButton_10->isChecked()==1)
answer="B";
}else if (a==2) {
ui->label_4->setText(query.value(1).toString());
QByteArray imgdata=query.value(6).toByteArray();
QPixmap pix;
pix.loadFromData(imgdata);
ui->label_5->setPixmap(pix);
ui->radioButton_5->setText(query.value(2).toString());
ui->radioButton_7->setText(query.value(3).toString());
ui->radioButton_6->setText(query.value(4).toString());
ui->radioButton_8->setText(query.value(5).toString());
correct_answer=query.value(7).toString();
if(ui->radioButton->isChecked()==1)
answer="A";
else if(ui->radioButton_3->isChecked()==1)
answer="B";
else if(ui->radioButton_2->isChecked()==1)
answer="C";
else if(ui->radioButton_4->isChecked()==1)
answer="D";
}
}
}
act_order++;
}
}
}
void ExamForm::on_pushButton_3_clicked()
{
this->hide();
lf->show();
}
void ExamForm::on_pushButton_clicked()
{
QSqlQuery query2;
QSqlQuery query;
if(act_order<=0)
{
QMessageBox msgBox;
msgBox.setWindowTitle("错误");
msgBox.setText("已是第1题");
msgBox.exec();
}else
{
act_order--;
query2.prepare("SELECT * FROM upper WHERE order_upper=:act_order");
query2.bindValue( ":act_order", act_order );
//QString sql= QString("SELECT * FROM upper WHERE order_upper=%1").arg(act_order);
if(!query2.exec())
{
qDebug()<<"sql="<<"act_order读取失败"<<query2.lastError().text();
return;
}
QString types;
int number;
if(query2.next())
{
types=query2.value(1).toString();
qDebug()<<"types="<<types<<query2.value(1);
number = query2.value(2).toInt();
}
//sql.clear();
QString sql=QString("SELECT * FROM %1 WHERE number='%2'")
.arg(types)
.arg(number);
if(query.exec(sql))
{
int a;
if(types.compare("title")==0)
a=0;
else if(types.compare("select1")==0)
a=1;
else
a=2;
ui->stackedWidget->setCurrentIndex(a);//切换界面
while(query.next())
{
if(a==0)
{
ui->label->setText(query.value(1).toString());
ui->radioButton->setText(query.value(2).toString());
ui->radioButton_3->setText(query.value(3).toString());
ui->radioButton_2->setText(query.value(4).toString());
ui->radioButton_4->setText(query.value(5).toString());
}else if (a==1) {
ui->label_6->setText(query.value(1).toString());
ui->radioButton_9->setText(query.value(2).toString());
ui->radioButton_10->setText(query.value(3).toString());
}else if (a==2) {
ui->label_4->setText(query.value(1).toString());
QByteArray imgdata=query.value(6).toByteArray();
QPixmap pix;
pix.loadFromData(imgdata);
ui->label_5->setPixmap(pix);
ui->radioButton_5->setText(query.value(2).toString());
ui->radioButton_7->setText(query.value(3).toString());
ui->radioButton_6->setText(query.value(4).toString());
ui->radioButton_8->setText(query.value(5).toString());
}
}
}
}
}
void ExamForm::examform_colse()
{
emit shot_exam();
close();
}
在这个文件里面,题目的产生代码是应该封装起来的,但写的时候想着是自己看的就没有封装,直接cv了,所以显得代码有点冗余,可以自己将代码封装起来,显得简洁一点,方便阅读,
examform.h
#ifndef EXAMFORM_H
#define EXAMFORM_H
#include <QWidget>
#include <QSqlDatabase>//数据库驱动,连接管理类
#include <QSqlQuery>//sql语句执行管理类
#include <QSqlRecord>//查询指令结果管理类
#include <QSqlError>//sql操作错误管理类
#include <QMessageBox>//提示对话框
#include <QTimer>//定时器
#include <QThread>//线程
#include<QRandomGenerator>//产生随机数
#include <QFile>
#include <QFileDialog>
#include <QImage>
#include <QMessageBox>
#include <QPixmap>
#include <QBuffer>
//界面
#include <lookform.h>
#include <QDebug>
void papers();
namespace Ui {
class ExamForm;
}
class ExamForm : public QWidget
{
Q_OBJECT
public:
explicit ExamForm(QWidget *parent = 0);
~ExamForm();
signals:
void mbflag(int);
void shot_exam();
public slots:
void examform_flag(int);
private slots:
void on_pushButton_2_clicked();
void Change_Label();//考试时间槽函数
void on_pushButton_3_clicked();
void on_pushButton_clicked();
void examform_colse();
private:
Ui::ExamForm *ui;
bool flag=false;//开始标志位
int min=119;//分钟
int sec=60;//秒
LookForm *lf;//答题情况
int order=0;
int act_order=0;
};
#endif // EXAMFORM_H
这给examform文件主要是实现答题界面的,题目的内容主要是放在了stacked widget的容器里面,这个容器可以存放widget类型的对象,可以把其它的界面放进去组合起来,实现局部界面切换的效果,其它的也没有什么了,看一下效果,界面比较拉跨
具体就是这样了,还有具体的代码放在了资源里面感兴趣的可以下载来看一下