1 Star 0 Fork 0

longPc/QtLearn

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
examdialog.cpp 7.89 KB
一键复制 编辑 原始数据 按行查看 历史
longPc 提交于 2023-12-13 09:43 . 项目完成;
#include "examdialog.h"
#include "QtWidgets/qapplication.h"
#include <QFile>
#include <QMessageBox>
#include <QPushButton>
examdialog::examdialog(QWidget *parent): QDialog(parent){
// 设置字体大小
QFont font;
font.setPointSize(12);
setFont(font);
// 设置窗体样式
setPalette(QPalette(QColor(255, 255, 255)));
setWindowTitle("考试已用时:0分0秒");
setWindowFlags(Qt::Dialog | Qt::WindowCloseButtonHint);
resize(800, 900);
// 初始化定时器
initTimer();
// 初始化布局
initLayout();
// 初始化题库
bool textEditState = initTextEdit();
if(!textEditState){
// 初始化失败提示并退出程序
QMessageBox::information(this, "提示", "初始化题库失败!");
QTimer::singleShot(0, qApp, SLOT(quit()));
}
// 初始化答案选择器
initButtons();
// 显示
show();
}
examdialog::~examdialog(){
}
void examdialog::initTimer(){
// 重置用时
m_timeGo = 0;
// 初始化定时器
m_timer = new QTimer(this);
m_timer->setInterval(1000);
m_timer->start();
// 连接信号和槽 - 过时
// connect(m_timer, SIGNAL(timeout()), SLOT(freshTime()));
// 连接信号和槽 - qt5开始
connect(m_timer, &QTimer::timeout, this, &examdialog::freshTime);
}
void examdialog::initLayout(){
m_layout = new QGridLayout(this);
// 设置控件间的间隔
m_layout->setSpacing(10);
// 设置窗体与控件的边距
m_layout->setContentsMargins(10, 10, 10, 10);
}
bool examdialog::initTextEdit(){
// 读取文件的行
QString strLine;
// 用于读取到的答案行
QStringList strList;
// 文件路径
QString filename("/Users/yuanxulong/longpc/Project/Learn/QT/QtLearn/res/exam.txt");
// 文件对象,用于打开上面的文件
QFile file(filename);
// 获取到的文件流
QTextStream stream(&file);
// 进行打开操作
bool openStatus = file.open(QIODeviceBase::ReadOnly | QIODeviceBase::Text);
// 打开失败就直接关闭
if(!openStatus){
return false;
}
// 用于保存显示到文本编辑器的数据
QString strText;
// 当前读取到的行数
int nLines = 0;
// 处理文本并放到控件上
while(!stream.atEnd()){
// 过滤第一行 - 第一行没用
if(nLines == 0){
stream.readLine();
nLines += 1;
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 += 1;
continue;
}
// 拼接题目文本
strText += stream.readLine();
strText += "\n";
nLines++;
}
// 处理完数据,开始显示
m_textEdit = new QTextEdit();
m_textEdit->setText(strText);
m_layout->addWidget(m_textEdit, 0, 0, 1, 10);
file.close();
return true;
}
void examdialog::initButtons(){
// 单选题答案列表
QStringList strList = {"A", "B", "C", "D"};
// 总共10道题
for (int i = 0; i < 10; i++) {
// 题目标签-第*题
m_titleLalbels[i] = new QLabel(this);
m_titleLalbels[i]->setText("第" + QString::number(i+1) + "题");
m_layout->addWidget(m_titleLalbels[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;
}
// 选择题
// 前8道题都是单选题,所以直接在这创建答案集合控件
if(i < 8){
m_btnGroups[i] = new QButtonGroup(this);
}
for (int j = 0; j < strList.count(); ++j) {
if(i == 8){
// 多选
m_checkBtns[j] = new QCheckBox(this);
m_checkBtns[j]->setText(strList[j]);
m_layout->addWidget(m_checkBtns[j], j+2, i);
continue;
}
// 单选
int index = 4 * i +j;
m_radioBtns[index] = new QRadioButton(this);
m_radioBtns[index]->setText(strList.at(j));
m_layout->addWidget(m_radioBtns[index], j+2, i);
// 用于解析选择的答案
m_btnGroups[i]->addButton(m_radioBtns[index]);
}
// 提交按钮
QPushButton *submitBtn = new QPushButton(this);
submitBtn->setText("提交");
submitBtn->setFixedSize(100, 35);
// 事件插槽和信号 - 过时
// connect(submitBtn,SIGNAL(clicked(bool)),this,SLOT(getScore()));
// 事件插槽和信号
connect(submitBtn, &QPushButton::clicked, this, &examdialog::getScore);
m_layout->addWidget(submitBtn, 5, 9);
}
}
void examdialog::freshTime(){
m_timeGo++;
QString mintues = QString::number(m_timeGo / 60);
QString second = QString::number(m_timeGo % 60);
setWindowTitle("考试已用时:" + mintues + "分" + second+ "秒");
}
bool examdialog::hasNoSelect(){
// 单选做的个数
int radioSelects = 0;
// 单选8题
for (int i = 0; i < 8; ++i) {
if(m_btnGroups[i]->checkedButton()){
radioSelects++;
}
}
// 如果选中个数小于8,说明有单选题没做
if(radioSelects < 8){
return true;
}
// 多选题 - 只选一个也不对
int checkSelects = 0;
for (int i = 0; i < 4; ++i) {
if(m_checkBtns[i]->isChecked()){
checkSelects++;
}
}
if(checkSelects <= 1){
return true;
}
//判断题 - 都没选说明就没做
if(!m_radioA->isChecked() && !m_radioB->isChecked()){
return true;
}
return false;
}
void examdialog::getScore(){
if(hasNoSelect()){
QMessageBox::information(this, "提示", "别嘚瑟了,还有题没做呢, 好好检查下!!!");
return;
}
// 得分 - 满分100
int scores = 0;
for (int i = 0; i < 10; ++i) {
// 单选题判断
if(i < 8 && 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 && m_btnGroups[8]->checkedButton()->text() == m_answerList.at(i)){
scores += 10;
}
}
QString str = "巨佬,您的得分是:" + QString::number(scores) + ",是否重新考试?";
int result = QMessageBox::information(this, "提示", str, QMessageBox::Ok | QMessageBox::No);
if(result == QMessageBox::Ok){
return;
}else{
close();
}
}
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/yuanxulong/qt-learn.git
git@gitee.com:yuanxulong/qt-learn.git
yuanxulong
qt-learn
QtLearn
master

搜索帮助