廣州哪里做網(wǎng)站品牌營(yíng)銷(xiāo)策劃方案怎么做
項(xiàng)目源碼和資源:科目一考試系統(tǒng): qt實(shí)現(xiàn)科目一考試系統(tǒng)
?一.項(xiàng)目概述
該項(xiàng)目是一個(gè)基于Qt框架開(kāi)發(fā)的在線考試系統(tǒng),主要實(shí)現(xiàn)了考試題目的隨機(jī)抽取、考試時(shí)間限制、成績(jī)統(tǒng)計(jì)等功能。用戶(hù)可以通過(guò)界面操作進(jìn)行考試,并查看自己的考試成績(jī)。
?
二.技術(shù)棧
Qt框架、C++語(yǔ)言、GUI設(shè)計(jì)、數(shù)據(jù)結(jié)構(gòu)、算法等。
三.界面展示
1.登錄界面
2.答題界面
3.提交界面
四.代碼展示
1.核心要點(diǎn)
整體項(xiàng)目共分為兩個(gè)部分,登錄界面和答題界面,登錄界面使用的qt設(shè)計(jì)器進(jìn)行手動(dòng)設(shè)計(jì),登錄界面核心的點(diǎn)在于使用正則表達(dá)式對(duì)已有賬號(hào)進(jìn)行分析,答題界面核心則是對(duì)文件中的試題進(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,"提示","非法的郵箱地址,請(qǐng)你重新輸入!");ui->lineEditaccount->clear();ui->lineEditpassword->clear();ui->lineEditaccount->setFocus();//設(shè)置光標(biāo)return;}else{//匹配成功了QString filename; //賬號(hào)密碼數(shù)據(jù)文件QString strAccInput;//用戶(hù)輸入的賬號(hào)QString strCode; //用戶(hù)輸入的密碼QString strLine; //每次讀取的一行數(shù)據(jù)QStringList strList;//保存分割讀取的一行數(shù)據(jù)filename = "account.txt";//發(fā)布時(shí)要進(jìn)行修改strAccInput = ui->lineEditaccount->text();//賬號(hào)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))//賬號(hào)匹配成功{if(strCode == strList.at(1)){//密碼匹配成功QMessageBox::information(this,"提示","歡迎進(jìn)入科目一考試系統(tǒng)!");file.close();done(Accepted);return;}else{QMessageBox::information(this,"提示","您輸入的密碼有誤,請(qǐng)重新輸入!");ui->lineEditpassword->clear();ui->lineEditpassword->setFocus();file.close();return;}}QMessageBox::information(this,"提示","您輸入的賬號(hào)有誤,請(qǐng)重新輸入!");ui->lineEditaccount->clear();ui->lineEditpassword->clear();ui->lineEditaccount->setFocus();file.close();return;}}else{QMessageBox::information(this,"提示","讀取賬號(hào)數(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ì)時(shí)器void initLayout(); //初始化布局管理器bool initTextEdit();//初始化文本編輯器void initButtons(); //初始化按鈕及標(biāo)簽bool hasNoSelect(); //判斷題目是否有未完成的
private:QTimer *m_timer; //計(jì)時(shí)器int m_timeGo; //考試已用時(shí)QTextEdit *m_textEdit; //考試題庫(kù)顯示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(); //刷新考試時(shí)間void getScore(); //獲取考試成績(jī)
};#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("考試已用時(shí):0分0秒");setWindowFlags(Qt::Dialog | Qt::WindowCloseButtonHint);resize(800,900);initTimer();initLayout();if(!initTextEdit()){QMessageBox::information(this,"提示","初始化題庫(kù)數(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()){//過(guò)濾首行if(nLines == 0){stream.readLine();nLines++;continue;}//過(guò)濾答案行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("錯(cuò)誤");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("考試已用時(shí):" + min + "分" + sec + "秒");
}void ExamDialog::getScore()
{if(hasNoSelect()){QMessageBox::information(this,"提示","您有未完成的題目,請(qǐng)完成考試!","是");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();
}
?