做電商網(wǎng)站的公司杭州做seo的公司
項(xiàng)目源碼和資源:科目一考試系統(tǒng): qt實(shí)現(xiàn)科目一考試系統(tǒng)
?一.項(xiàng)目概述
該項(xiàng)目是一個基于Qt框架開發(fā)的在線考試系統(tǒng),主要實(shí)現(xiàn)了考試題目的隨機(jī)抽取、考試時間限制、成績統(tǒng)計(jì)等功能。用戶可以通過界面操作進(jìn)行考試,并查看自己的考試成績。
?
二.技術(shù)棧
Qt框架、C++語言、GUI設(shè)計(jì)、數(shù)據(jù)結(jié)構(gòu)、算法等。
三.界面展示
1.登錄界面
2.答題界面
3.提交界面
四.代碼展示
1.核心要點(diǎn)
整體項(xiàng)目共分為兩個部分,登錄界面和答題界面,登錄界面使用的qt設(shè)計(jì)器進(jìn)行手動設(shè)計(jì),登錄界面核心的點(diǎn)在于使用正則表達(dá)式對已有賬號進(jìn)行分析,答題界面核心則是對文件中的試題進(jìn)行處理。
?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()
{//設(shè)置窗口大小int wide=ui->labelimage->width();int height=ui->labelimage->height();this->setGeometry(600,300,wide,height);this->setWindowTitle("科目一考試系統(tǒng)");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();//設(shè)置光標(biāo)return;}else{//匹配成功了QString filename; //賬號密碼數(shù)據(jù)文件QString strAccInput;//用戶輸入的賬號QString strCode; //用戶輸入的密碼QString strLine; //每次讀取的一行數(shù)據(jù)QStringList strList;//保存分割讀取的一行數(shù)據(jù)filename = "account.txt";//發(fā)布時要進(jìn)行修改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,"提示","歡迎進(jìn)入科目一考試系統(tǒng)!");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,"提示","讀取賬號數(shù)據(jù)文件失敗!");return;}}}void LoginDialog::on_pushButtonCancel_clicked()
{//關(guān)閉窗口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(); //初始化計(jì)時器void initLayout(); //初始化布局管理器bool initTextEdit();//初始化文本編輯器void initButtons(); //初始化按鈕及標(biāo)簽bool hasNoSelect(); //判斷題目是否有未完成的
private:QTimer *m_timer; //計(jì)時器int m_timeGo; //考試已用時QTextEdit *m_textEdit; //考試題庫顯示QLabel *m_titleLabels[10]; //題目標(biāo)簽QButtonGroup *m_btnGroups[9]; //單項(xiàng)按鈕分組QRadioButton *m_radioBtns[32]; //單選題按鈕QCheckBox *m_checkBtns[4]; //多選題按鈕QRadioButton *m_radioA; //判斷題A選項(xiàng)QRadioButton *m_radioB; //判斷題B選項(xiàng)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)
{//設(shè)置字體大小QFont font;font.setPointSize(12);setFont(font);//設(shè)置窗體背景顏色setPalette(QPalette(QColor(209,215,255)));setWindowTitle("考試已用時:0分0秒");setWindowFlags(Qt::Dialog | Qt::WindowCloseButtonHint);resize(800,900);initTimer();initLayout();if(!initTextEdit()){QMessageBox::information(this,"提示","初始化題庫數(shù)據(jù)文件失敗!");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); //設(shè)置控件間的間距m_layout->setMargin(10); //設(shè)置窗體與控件間的間隙
}bool ExamDialog::initTextEdit()
{QString strLine; //保存文件中讀取到的一行數(shù)據(jù)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; //用于保存顯示到文本編輯器的數(shù)據(jù)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++){//題目標(biāo)簽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){//多項(xiàng)多選題m_checkBtns[j] = new QCheckBox(this);m_checkBtns[j]->setText(strList.at(j));m_layout->addWidget(m_checkBtns[j],2+j,8);}else{//單項(xiàng)選擇題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++){//單選題計(jì)分if( i < 8)if(m_btnGroups[i]->checkedButton()->text() == m_answerList.at(i))scores += 10;//多項(xiàng)選擇題計(jì)分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;}//判斷題計(jì)分if(i == 9){if(m_btnGroups[8]->checkedButton()->text() == m_answerList.at(i))scores += 10;}}QString str = "您的分?jǐn)?shù)是:" + QString::number(scores) + "分,是否重新考試?";int res = QMessageBox::information(this,"提示",str,QMessageBox::Yes | QMessageBox::No);if(res == QMessageBox::Yes)return;elseclose();
}
?