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语言中有⼀系列的函数是专门…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...
spring:实例工厂方法获取bean
spring处理使用静态工厂方法获取bean实例,也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下: 定义实例工厂类(Java代码),定义实例工厂(xml),定义调用实例工厂ÿ…...

c#开发AI模型对话
AI模型 前面已经介绍了一般AI模型本地部署,直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型,但是目前国内可能使用不多,至少实践例子很少看见。开发训练模型就不介绍了&am…...
今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存
文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...
Linux离线(zip方式)安装docker
目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1:修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本:CentOS 7 64位 内核版本:3.10.0 相关命令: uname -rcat /etc/os-rele…...

回溯算法学习
一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...

[免费]微信小程序问卷调查系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】
大家好,我是java1234_小锋老师,看到一个不错的微信小程序问卷调查系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】,分享下哈。 项目视频演示 【免费】微信小程序问卷调查系统(SpringBoot后端Vue管理端) Java毕业设计_哔哩哔哩_bilibili 项…...
Vite中定义@软链接
在webpack中可以直接通过符号表示src路径,但是vite中默认不可以。 如何实现: vite中提供了resolve.alias:通过别名在指向一个具体的路径 在vite.config.js中 import { join } from pathexport default defineConfig({plugins: [vue()],//…...
提升移动端网页调试效率:WebDebugX 与常见工具组合实践
在日常移动端开发中,网页调试始终是一个高频但又极具挑战的环节。尤其在面对 iOS 与 Android 的混合技术栈、各种设备差异化行为时,开发者迫切需要一套高效、可靠且跨平台的调试方案。过去,我们或多或少使用过 Chrome DevTools、Remote Debug…...

【C++】纯虚函数类外可以写实现吗?
1. 答案 先说答案,可以。 2.代码测试 .h头文件 #include <iostream> #include <string>// 抽象基类 class AbstractBase { public:AbstractBase() default;virtual ~AbstractBase() default; // 默认析构函数public:virtual int PureVirtualFunct…...