Qt驾考项目

ExamDialog.h:

#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 initButtion();//初始化按键和标签
    bool hasNoSelect();//判断题目是否完成

private slots:
    void freshTime();//刷新考试时间
    void getScore();//获取成绩

private:
    QTimer *m_timer;//计时器
    int m_timerGo;//考试用时

    QTextEdit *m_textEdit;//考试题库显示
    QLabel *m_labelLabels[10];//题目标签
    QRadioButton *m_radioBtns[32];//单选题按钮
    QCheckBox *m_cheBtns[4];//多选题按钮
    QRadioButton *m_radioA;//判断题A
    QRadioButton *m_radioB;//判断题B
    QGridLayout *m_layout;//布局管理器
    QStringList m_answerList;//答案
    QButtonGroup *m_btnGroup[9];//单项分组
};

#endif // EXAMDIALOG_H

ExamDialog.cpp

#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,225)));

    setWindowTitle("考试用时:0分0秒");

    //设置只有关闭按钮
    setWindowFlags(Qt::Dialog|Qt::WindowCloseButtonHint);

    //设置窗体大小
    resize(800,900);

    initTimer();
    initLayout();

    if(!initTextEdit()){
        QMessageBox::information(this,"提示","打开文件失败");
        QTimer::singleShot(0,qApp,SLOT(quit()));//退出程序
    }
    initButtion();
}

void ExamDialog::initTimer()
{
    m_timerGo = 0;
    m_timer = new QTimer(this);
    m_timer->setInterval(1000);
    m_timer->start();

    //连接信号与槽connect(发送信号者,发送的信息,响应信号者,响应的槽方法)
    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 nLins=0;//行

        while(!stream.atEnd()){
            //过滤第一行
            if(nLins == 0){
                stream.readLine();
                nLins++;
                continue;
            }

            //过滤答案行
            if((nLins>=6 && nLins<=6*9 && nLins%6==0)||nLins==6*9+4){
                strLine = stream.readLine();//读一行
                strList = strLine.split(" ");//答案格式为:答案 A,以空格截取
                m_answerList.append(strList.at(1));//保存答案0-答案 1-A
                strText += "\n";
                nLins++;
                continue;
            }
            strText += stream.readLine();
            strText += "\n";
            nLins++;
        }
        m_textEdit->setText(strText);//设置内容
        m_layout->addWidget(m_textEdit,0,0,1,10);//设置0行0列占位1行10列
        file.close();
        return true;

    }else{
        return false;
    }

}

void ExamDialog::initButtion()
{
    QStringList strList = {"A","B","C","D"};

    for(int i=0;i<10;i++){
        m_labelLabels[i] = new QLabel(this);//new一个标签
        m_labelLabels[i]->setText("第"+QString::number(i+1)+"题");//设置内容
        m_layout->addWidget(m_labelLabels[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_btnGroup[8] = new QButtonGroup(this);
            m_btnGroup[8]->addButton(m_radioA);
            m_btnGroup[8]->addButton(m_radioB);
            break;
        }
        if(i<8)m_btnGroup[i] = new QButtonGroup(this);

        //选择题
        for(int j = 0;j < 4; j++){
            if(i == 8){//多选题
                m_cheBtns[j] = new QCheckBox(this);
                m_cheBtns[j]->setText(strList.at(j));
                m_layout->addWidget(m_cheBtns[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_btnGroup[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_btnGroup[i]->checkedButton())
            radioSelects++;
    }

    //单选题未完成
    if(radioSelects != 8){
        return true;
    }

    int checkSelect = 0;
    for(int i = 0; i < 4; i++){
        if(m_cheBtns[i]->isChecked())
            checkSelect++;
    }
    //多选题未完成
    if(checkSelect ==0 || checkSelect == 1)
        return true;
    //判断题未完成
    if(!m_radioA->isChecked() && !m_radioB->isChecked())
        return true;

    return false;
}

void ExamDialog::freshTime()
{
    m_timerGo++;
    QString min = QString::number(m_timerGo / 60);
    QString sec = QString::number(m_timerGo %  60);
    setWindowTitle("考试用时:"+min+"分"+sec+"秒");
}

void ExamDialog::getScore()
{
    if(hasNoSelect()){
        QMessageBox::information(this,"提示","还有题目未做完,请继续!");
        return;
    }
    int score = 0 ;
    for(int i = 0; i < 10 ; i++){
        //单选题
        if(i < 8){
            if(m_btnGroup[i]->checkedButton()->text() == m_answerList.at(i)){
                score+=10;
            }
        }
        if(i == 8){
            QString answer = m_answerList.at(i);
            bool hasA = answer.contains("A")?true:false;
            bool hasB = answer.contains("B")?true:false;
            bool hasC = answer.contains("C")?true:false;
            bool hasD = answer.contains("D")?true:false;

            bool checkA = m_cheBtns[0]->checkState();
            bool checkB = m_cheBtns[1]->checkState();
            bool checkC = m_cheBtns[2]->checkState();
            bool checkD = m_cheBtns[3]->checkState();

            if(hasA != checkA)continue;
            if(hasB != checkB)continue;
            if(hasC != checkC)continue;
            if(hasD != checkD)continue;

            score += 10;

        }
        //判断题
        if(i ==9){
            if(m_btnGroup[8]->checkedButton()->text() == m_answerList.at(i)){
                score += 10;
            }
        }
    }
    QString str = "你的分数是:"+QString::number(score)+"分,是否重新考试";
    int res = QMessageBox::information(this,"提示",str,QMessageBox::Yes|QMessageBox::No);
    if(res==QMessageBox::Yes){
        return;
    }else{
        close();
    }
}

loginDia.h

#ifndef LOGINDIA_H
#define LOGINDIA_H

#include<QDialog>

namespace Ui {
class loginDia;
}

class loginDia : public QDialog
{
    Q_OBJECT

public:
    explicit loginDia(QWidget *parent = 0);
    ~loginDia();
private slots:
   void on_loginButton_clicked();
   void on_calcelButton_clicked();

private:
    Ui::loginDia *ui;
};

#endif // LOGINDIA_H

loginDia.cpp

#include "logindia.h"
#include "ui_logindia.h"
#include<QMessageBox>
#include<QFile>
#include<QTextStream>

loginDia::loginDia(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::loginDia)
{
    ui->setupUi(this);

    //固定窗体大小
    setFixedSize(width(),height());
    //图片填充
    ui->png->setScaledContents(true);

    //重置窗体的宽和高
    resize(ui->png->width(),ui->png->height());

    //设置窗口标题
    setWindowTitle("科目一考试系统");

    //设置窗口右上角仅关闭
    setWindowFlags(Qt::Dialog|Qt::WindowCloseButtonHint);
}

loginDia::~loginDia()
{

}



void loginDia::on_loginButton_clicked()
{

    //正则表达式
    QRegExp rx("^[A-Za-z0-9]+([_\.][A-Za-z0-9]+)*@([A-Za-z0-9\-]+\.)+[A-Za-z]{2,6}$");
    bool res = rx.exactMatch(ui->accontEdit->text());
    if(res){
        //QMessageBox::information(this,"提示","欢迎登陆驾考科目一系统");
        QString filename = "../accont.txt";//账号密码文件
        QString strAccInput;//用户输入账号
        QString strCode;//用户输入密码
        QString strLine;//读取一行
        QStringList strList;//分割读取一行的数据

        strAccInput = ui->accontEdit->text();
        strCode = ui->passwordEdit->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->passwordEdit->clear();
                        ui->passwordEdit->setFocus();
                        file.close();
                        return;
                    }

                QMessageBox::information(this,"提示","账号输入有误请重新输入");
                ui->accontEdit->clear();
                ui->accontEdit->setFocus();
                ui->passwordEdit->clear();
                file.close();
                return;
            }
        }else{
            QMessageBox::information(this,"提示","打开文件失败");
            return;
        }

    }else{
        QMessageBox::information(this,"提示","输入非法邮箱请重新输入");
        ui->accontEdit->clear();
        ui->accontEdit->setFocus();
        ui->passwordEdit->clear();
        return;
    }
}



void loginDia::on_calcelButton_clicked()
{
    done(Rejected);//关闭当前窗口并以用户拒绝状态返回
}

main.cpp

#include "logindia.h"
#include <QApplication>
#include"examdialog.h"
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    //loginDia w;
   // w.show();
   // ExamDialog w;
    //w.show();
    loginDia logindia;
    int res = logindia.exec();//登录窗口以模态方式运行

    if(res == QDialog::Accepted){
        ExamDialog *examDialog;
        examDialog = new ExamDialog;
        examDialog->show();
    }else{
        return 0;
    }
    return a.exec();
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值