Qt 科目一考试系统(有源码)
项目源码和资源:科目一考试系统: qt实现科目一考试系统
一.项目概述
该项目是一个基于Qt框架开发的在线考试系统,主要实现了考试题目的随机抽取、考试时间限制、成绩统计等功能。用户可以通过界面操作进行考试,并查看自己的考试成绩。
二.技术栈
Qt框架、C++语言、GUI设计、数据结构、算法等。
三.界面展示
1.登录界面

2.答题界面

3.提交界面

四.代码展示
1.核心要点
整体项目共分为两个部分,登录界面和答题界面,登录界面使用的qt设计器进行手动设计,登录界面核心的点在于使用正则表达式对已有账号进行分析,答题界面核心则是对文件中的试题进行处理。
2.登录界面代码
#ifndef LOGINDIALOG_H
#define LOGINDIALOG_H#include <QDialog>QT_BEGIN_NAMESPACE
namespace Ui { class LoginDialog; }
QT_END_NAMESPACEclass LoginDialog : public QDialog
{Q_OBJECTpublic:LoginDialog(QWidget *parent = nullptr);~LoginDialog();private slots:void on_pushButtonOk_clicked();void on_pushButtonCancel_clicked();private:Ui::LoginDialog *ui;private:void InitUI();
};
#endif // LOGINDIALOG_H
#include "logindialog.h"
#include "ui_logindialog.h"
#include<QIcon>
#include<QMessageBox>
#include<QFile>
#include<QTextStream>LoginDialog::LoginDialog(QWidget *parent): QDialog(parent), ui(new Ui::LoginDialog)
{ui->setupUi(this);InitUI();
}LoginDialog::~LoginDialog()
{delete ui;
}void LoginDialog::InitUI()
{//设置窗口大小int wide=ui->labelimage->width();int height=ui->labelimage->height();this->setGeometry(600,300,wide,height);this->setWindowTitle("科目一考试系统");this->setWindowFlags(Qt::Dialog|Qt::WindowTitleHint);}void LoginDialog::on_pushButtonOk_clicked()
{QRegExp rx("^[a-zA-Z][\\w]{5,17}@([A-Za-z0-9\\-]+\\.)+[A-Za-z]{2,6}$");bool res = rx.exactMatch(ui->lineEditaccount->text());if(!res){//匹配不成功QMessageBox::information(this,"提示","非法的邮箱地址,请你重新输入!");ui->lineEditaccount->clear();ui->lineEditpassword->clear();ui->lineEditaccount->setFocus();//设置光标return;}else{//匹配成功了QString filename; //账号密码数据文件QString strAccInput;//用户输入的账号QString strCode; //用户输入的密码QString strLine; //每次读取的一行数据QStringList strList;//保存分割读取的一行数据filename = "account.txt";//发布时要进行修改strAccInput = ui->lineEditaccount->text();//账号strCode = ui->lineEditpassword->text();//密码QFile file(filename);QTextStream stream(&file);if( file.open(QIODevice::ReadOnly | QIODevice::Text) ){while(!stream.atEnd()){strLine = stream.readLine();strList = strLine.split(",");if(strAccInput == strList.at(0))//账号匹配成功{if(strCode == strList.at(1)){//密码匹配成功QMessageBox::information(this,"提示","欢迎进入科目一考试系统!");file.close();done(Accepted);return;}else{QMessageBox::information(this,"提示","您输入的密码有误,请重新输入!");ui->lineEditpassword->clear();ui->lineEditpassword->setFocus();file.close();return;}}QMessageBox::information(this,"提示","您输入的账号有误,请重新输入!");ui->lineEditaccount->clear();ui->lineEditpassword->clear();ui->lineEditaccount->setFocus();file.close();return;}}else{QMessageBox::information(this,"提示","读取账号数据文件失败!");return;}}}void LoginDialog::on_pushButtonCancel_clicked()
{//关闭窗口this->close();
}
3.答题界面代码
#ifndef EXAMDIALOG_H
#define EXAMDIALOG_H
#include <QDialog>
#include <QTimer>
#include <QTextEdit>
#include <QLabel>
#include <QRadioButton>
#include <QCheckBox>
#include <QGridLayout>
#include <QButtonGroup>class ExamDialog : public QDialog
{Q_OBJECT
public:ExamDialog(QWidget* parent = 0);void initTimer(); //初始化计时器void initLayout(); //初始化布局管理器bool initTextEdit();//初始化文本编辑器void initButtons(); //初始化按钮及标签bool hasNoSelect(); //判断题目是否有未完成的
private:QTimer *m_timer; //计时器int m_timeGo; //考试已用时QTextEdit *m_textEdit; //考试题库显示QLabel *m_titleLabels[10]; //题目标签QButtonGroup *m_btnGroups[9]; //单项按钮分组QRadioButton *m_radioBtns[32]; //单选题按钮QCheckBox *m_checkBtns[4]; //多选题按钮QRadioButton *m_radioA; //判断题A选项QRadioButton *m_radioB; //判断题B选项QGridLayout *m_layout; //布局管理器QStringList m_answerList; //答案private slots:void freshTime(); //刷新考试时间void getScore(); //获取考试成绩
};#endif // EXAMDIALOG_H
#include "examdialog.h"
#include <QFile>
#include <QTextStream>
#include <QMessageBox>
#include <QApplication>
#include <QPushButton>ExamDialog::ExamDialog(QWidget* parent):QDialog(parent)
{//设置字体大小QFont font;font.setPointSize(12);setFont(font);//设置窗体背景颜色setPalette(QPalette(QColor(209,215,255)));setWindowTitle("考试已用时:0分0秒");setWindowFlags(Qt::Dialog | Qt::WindowCloseButtonHint);resize(800,900);initTimer();initLayout();if(!initTextEdit()){QMessageBox::information(this,"提示","初始化题库数据文件失败!");QTimer::singleShot(0,qApp,SLOT(quit()));}initButtons();show();
}void ExamDialog::initTimer()
{m_timeGo = 0;m_timer = new QTimer(this);m_timer->setInterval(1000);m_timer->start();connect(m_timer,SIGNAL(timeout()),this,SLOT(freshTime()));
}void ExamDialog::initLayout()
{m_layout = new QGridLayout(this);m_layout->setSpacing(10); //设置控件间的间距m_layout->setMargin(10); //设置窗体与控件间的间隙
}bool ExamDialog::initTextEdit()
{QString strLine; //保存文件中读取到的一行数据QStringList strList; //保存读取到的答案行QString fileName("exam.txt");QFile file(fileName);QTextStream stream(&file);stream.setCodec("UTF-8");if( file.open(QIODevice::ReadOnly | QIODevice::Text) ){m_textEdit = new QTextEdit(this);m_textEdit->setReadOnly(true);QString strText; //用于保存显示到文本编辑器的数据int nLines = 0;while(!stream.atEnd()){//过滤首行if(nLines == 0){stream.readLine();nLines++;continue;}//过滤答案行if( (nLines >= 6 && nLines <= 6 * 9 && (nLines % 6 == 0) )|| (nLines == 6 * 9 + 4) ){strLine = stream.readLine();strList = strLine.split(" ");m_answerList.append(strList.at(1));strText += "\n";nLines++;continue;}strText += stream.readLine();strText += "\n";nLines++;}m_textEdit->setText(strText);m_layout->addWidget(m_textEdit,0,0,1,10);file.close();return true;}else{return false;}
}void ExamDialog::initButtons()
{QStringList strList = {"A","B","C","D"};for(int i = 0; i <10; i++){//题目标签m_titleLabels[i] = new QLabel(this);m_titleLabels[i]->setText("第" + QString::number(i+1) + "题");m_layout->addWidget(m_titleLabels[i],1,i);//判断题if(i == 9){m_radioA = new QRadioButton(this);m_radioB = new QRadioButton(this);m_radioA->setText("正确");m_radioB->setText("错误");m_layout->addWidget(m_radioA,2,9);m_layout->addWidget(m_radioB,3,9);m_btnGroups[8] = new QButtonGroup(this);m_btnGroups[8]->addButton(m_radioA);m_btnGroups[8]->addButton(m_radioB);break;}if(i < 8) m_btnGroups[i] = new QButtonGroup(this);//选择题for(int j = 0; j < 4; j++){if( i == 8){//多项多选题m_checkBtns[j] = new QCheckBox(this);m_checkBtns[j]->setText(strList.at(j));m_layout->addWidget(m_checkBtns[j],2+j,8);}else{//单项选择题m_radioBtns[4 * i + j] = new QRadioButton(this);m_radioBtns[4 * i + j]->setText(strList.at(j));m_layout->addWidget(m_radioBtns[4 * i + j],2+j,i);m_btnGroups[i]->addButton(m_radioBtns[4 * i + j]);}}}QPushButton *submitBtn = new QPushButton(this);submitBtn->setText("提交");submitBtn->setFixedSize(100,35);connect(submitBtn,SIGNAL(clicked(bool)),this,SLOT(getScore()));m_layout->addWidget(submitBtn,6,9);
}bool ExamDialog::hasNoSelect()
{int radioSelects = 0;for(int i = 0; i < 8; i++){if( m_btnGroups[i]->checkedButton() )radioSelects++;}if(radioSelects != 8)return true;int checkSelects = 0;for(int i = 0; i < 4; i++){if(m_checkBtns[i]->isChecked())checkSelects++;}if(checkSelects == 0 || checkSelects == 1)return true;if(!m_radioA->isChecked() && !m_radioB->isChecked())return true;return false;
}void ExamDialog::freshTime()
{m_timeGo++;QString min = QString::number(m_timeGo / 60);QString sec = QString::number(m_timeGo % 60);setWindowTitle("考试已用时:" + min + "分" + sec + "秒");
}void ExamDialog::getScore()
{if(hasNoSelect()){QMessageBox::information(this,"提示","您有未完成的题目,请完成考试!","是");return;}int scores = 0;for(int i = 0; i < 10; i++){//单选题计分if( i < 8)if(m_btnGroups[i]->checkedButton()->text() == m_answerList.at(i))scores += 10;//多项选择题计分if(i == 8){QString answer = m_answerList.at(i);bool hasA = false;bool hasB = false;bool hasC = false;bool hasD = false;if( answer.contains("A") ) hasA = true;if( answer.contains("B") ) hasB = true;if( answer.contains("C") ) hasC = true;if( answer.contains("D") ) hasD = true;bool checkA = m_checkBtns[0]->checkState();bool checkB = m_checkBtns[1]->checkState();bool checkC = m_checkBtns[2]->checkState();bool checkD = m_checkBtns[3]->checkState();if( hasA != checkA) continue;if( hasB != checkB) continue;if( hasC != checkC) continue;if( hasD != checkD) continue;scores += 10;}//判断题计分if(i == 9){if(m_btnGroups[8]->checkedButton()->text() == m_answerList.at(i))scores += 10;}}QString str = "您的分数是:" + QString::number(scores) + "分,是否重新考试?";int res = QMessageBox::information(this,"提示",str,QMessageBox::Yes | QMessageBox::No);if(res == QMessageBox::Yes)return;elseclose();
}
相关文章:
Qt 科目一考试系统(有源码)
项目源码和资源:科目一考试系统: qt实现科目一考试系统 一.项目概述 该项目是一个基于Qt框架开发的在线考试系统,主要实现了考试题目的随机抽取、考试时间限制、成绩统计等功能。用户可以通过界面操作进行考试,并查看自己的考试成绩。 二.技…...
在 Visual Studio 2022 (VS2022) 中删除 Git 分支的步骤如下
git branch -r PS \MauiApp1> git push origin --delete “20240523备份” git push origin --delete “20240523备份”...
玩转OpenHarmony智能家居:如何实现开发版“碰一碰”设备控制
一、简介 “碰一碰”设备控制,依托NFC短距通信协议,通过碰一碰的交互方式,将OpenAtom OpenHarmony(简称“OpenHarmony”)标准系统设备和全场景设备连接起来,解决了应用与设备之间接续慢、传输难的问题&…...
订餐系统总结、
应用层: SpringBoot:快速构建Spring项目,采用“约定大于配置”的思想,简化Spring项目的配置开发。 SpringMvc:Spring框架的一个模块,springmvc和spring无需通过中间整合层进行整合,可以无缝集成。 Sprin…...
【因果推断从入门到精通二】随机实验3
目录 检验无因果效应假说 硬币投掷的特殊性何在? 检验无因果效应假说 无因果效应假说认为,有些人存活,有些人死亡,但接受mAb114治疗而不是ZMapp与此无关。在174例接受mAb14治疗的患者中,113/17464.9%存活了28天&…...
真实案例分享,终端pc直接telnet不到出口路由器。
1、背景信息 我终端pc的网卡地址获取的网关是在核心交换机上,在核心交换机上telnet出口路由器可以实现。 所有终端网段都不能telnet出口路由器,客户希望能用最小的影响方式进行解决。 2、现有配置信息 终端的无线和有线分别在两个网段中,…...
YOLOv8_seg的训练、验证、预测及导出[实例分割实践篇]
实例分割数据集链接,还是和目标检测篇一样,从coco2017val数据集中挑出来person和surfboard两类:链接:百度网盘 请输入提取码 提取码:3xmm 1.实例分割数据划分及配置 1.1实例分割数据划分 从上面得到的数据还不能够直接训练,需要按照一定的比例划分训练集和验证集,并按…...
Linux基础(四):Linux系统文件类型与文件权限
各位看官,好久不见,在正式介绍Linux的基本命令之前,我们首先了解一下,关于文件的知识。 目录 一、文件类型 二、文件权限 2.1 文件访问者的分类 2.2 文件权限 2.2.1 文件的基本权限 2.2.2 文件权限值的表示方法 三、修改文…...
本是梦中人,常作花下客。心中自往来,知我有几个。
我们总是喜欢拿“顺其自然”来敷衍人生道路上的荆棘坎坷,却很少承认,真正的顺其自然, 其实是竭尽所能之后的不强求, 而非两手一摊的不作为。 一花凋零荒芜不了整个春天, 一次挫折也荒废不了整个人生。 多年后&#x…...
创新指南|利用电商产品视频进行渠道营销的最佳策略,不断提升销售额
无论企业的利基市场如何,电商产品视频都已被证明是非常可靠的资产,可以让目标受众了解您所提供的产品——关键功能、展示重要的差异化优势甚至改变大多数营销活动的游戏规则。阅读本文,全面了解电商产品视频如何融入营销推广,以最…...
深度学习之基于YoloV5入侵检测系统
欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景 随着信息技术的飞速发展,网络安全问题日益凸显。入侵检测系统(IDS࿰…...
【01】全面理解JVM虚拟机
一、前言 学习JVM是进行JVM调优的基础。写的代码部署到线上它会如何运行?要配多少内存?线上环境出问题了,服务崩溃了,应该怎么快速定位?这些问题都与JVM有着一定的关系。好的程序员都应该尽自己的能力把JVM每个底层逻…...
CentOS7离线安装Nginx
目录 1. 安装gcc2. 安装g3. 安装openssl4. 安装pcre5. 安装zlib6. 安装Nginx7. 启动nginx8. 开放80端口9. 访问测试10. 设置开机自启 Nginx离线安装需要依赖gcc、g环境,安装前要先检查linux系统中是否自带gcc和g,如果没有就需要先进行安装。 然后再安装o…...
面试字节大模型算法实习岗,感觉有点崩溃。。。
节前,我们组织了一场算法岗技术&面试讨论会,邀请了一些互联网大厂朋友、今年参加社招和校招面试的同学。 针对大模型技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备面试攻略、面试常考点等热门话题进行了深入的讨论。 总结链接…...
k8s 1.24.x之后如果rest 访问apiserver
1.由于 在 1.24 (还是 1.20 不清楚了)之后,下面这两个apiserver的配置已经被弃用 了,简单的说就是想不安全的访问k8s是不可能了,所以只能走安全的访问方式也就是 https://xx:6443了,所以需要证书。 - --ins…...
深度解析:用 Python 爬虫逆向破解 solscan 的请求头加密参数 Sol-Aut
大家好!我是爱摸鱼的小鸿,关注我,收看每期的编程干货。 逆向是爬虫工程师进阶必备技能,当我们遇到一个问题时可能会有多种解决途径,而如何做出最高效的抉择又需要经验的积累。本期文章将以实战的方式,带你详细地逆向分析 solscan 网站请求头加密字段 Sol-Aut 的构造逻辑,…...
Flutter 中的 InputDecorator 小部件:全面指南
Flutter 中的 InputDecorator 小部件:全面指南 在Flutter中,InputDecorator是一个用于装饰输入字段的组件,它为TextField和TextFormField提供了一个统一的外观和布局。InputDecorator可以让您自定义输入框的标签、填充、边框、图标、光标、错…...
useTransition:开启React并发模式
写在前面:并发 并发模式(Concurrent Mode)1的一个关键特性是渲染可中断。 React 18 之前,更新内容渲染的方式是通过一个单一的且不可中断的同步事务进行处理。同步渲染意味着,一旦开始渲染就无法中断,直到…...
Android 12系统源码_多窗口模式(二)系统实现分屏的功能原理
前言 上一篇我们具体分析了系统处于多窗口模式下,Android应用和多窗口模式相关方法的调用顺序,对于应用如何适配多窗口模式有了一个初步的认识,本篇文章我们将会结合Android12系统源码,具体来梳理一下系统是如何触发多窗口分屏模…...
字符函数:分类函数与转换函数
字符函数 一.字符分类函数二.字符转换函数 在编程的过程中,我们经常要处理字符和字符串,为了方便操作字符和字符串,C语⾔标准库中提供了一系列库函数,接下来我们就学习⼀下这些函数。 一.字符分类函数 C语言中有⼀系列的函数是专门…...
IDEA运行Tomcat出现乱码问题解决汇总
最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…...
未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?
编辑:陈萍萍的公主一点人工一点智能 未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战,在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...
Vue记事本应用实现教程
文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展:显示创建时间8. 功能扩展:记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...
RocketMQ延迟消息机制
两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数,对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后…...
基于当前项目通过npm包形式暴露公共组件
1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹,并新增内容 3.创建package文件夹...
Qt Http Server模块功能及架构
Qt Http Server 是 Qt 6.0 中引入的一个新模块,它提供了一个轻量级的 HTTP 服务器实现,主要用于构建基于 HTTP 的应用程序和服务。 功能介绍: 主要功能 HTTP服务器功能: 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...
HTML前端开发:JavaScript 常用事件详解
作为前端开发的核心,JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例: 1. onclick - 点击事件 当元素被单击时触发(左键点击) button.onclick function() {alert("按钮被点击了!&…...
Java入门学习详细版(一)
大家好,Java 学习是一个系统学习的过程,核心原则就是“理论 实践 坚持”,并且需循序渐进,不可过于着急,本篇文章推出的这份详细入门学习资料将带大家从零基础开始,逐步掌握 Java 的核心概念和编程技能。 …...
Android15默认授权浮窗权限
我们经常有那种需求,客户需要定制的apk集成在ROM中,并且默认授予其【显示在其他应用的上层】权限,也就是我们常说的浮窗权限,那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...
自然语言处理——循环神经网络
自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元(GRU)长短期记忆神经网络(LSTM)…...
