用QT做一个单机版答题系统(数据库MySql)

在用QT做一个答题系统之前,先实现单机版的从数据库读题的功能。
以下是我在上一篇的基础上加入连接数据库并读题的代码及最后实现的界面。
首先在pro里加入sql

QT       += core gui  sql

在数据库中建表的时候 需要题号,题目,选项A,B,C,正确答案选项
于是在头文件中建了6个表来存放:

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QList>
#include <QTimerEvent>
#include <QtSql>
#include <QDebug>
#include <QString>
#include <QPaintEvent>

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

    void timerEvent(QTimerEvent *event);

    void paintEvent(QPaintEvent *event);

private slots:
    void on_pushButton_2_clicked();

    void on_pushButton_clicked();

    void on_pushButton_3_clicked();

    void showDatabaseDataSlot();
    void on_pushButton_4_clicked();

    void on_pushButton_5_clicked();

private:
    Ui::Widget *ui;
    QSqlDatabase db;

    QList<QString> listN;  //题目序号
    QList<QString> list1;  //题目
    QList<QString> listA;  //选项A
    QList<QString> listB;  //选项B
    QList<QString> listC;  //选项C

    QList<QString> listD;      //正确选项

    int timerId;
    int score;
    int currentQ;

    bool stop;
};

#endif // WIDGET_H

在主函数中加入stop标志位让选择完一题以后不能重选的功能以及设置背景的功能(提前把图片放进去)

#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
#include <QMessageBox>
#include <QSqlQuery>
#include <QTime>
#include <QSqlError>
#include <QSqlDriver>
#include <QSqlRecord>
#include <QSqlDatabase>
#include <QPainter>


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

    stop = false;              //标志位
    score = 0;                 //原始分数
    currentQ = 0;              //题目序号




    ui->lcdNumber->display(10);    //初始时间10s
    timerId = startTimer(500);         //间隔1s
}

Widget::~Widget()
{
    delete ui;
}

void Widget::timerEvent(QTimerEvent *event)
{
    ui->lcdNumber->display(ui->lcdNumber->value() - 1);      //显示-1
    if(ui->lcdNumber->value() == 0)
    {

        if (currentQ == 4 )
        {
            QMessageBox::information(this, "", QString("答题结束, 得分: %1").arg(score));
            killTimer(timerId);
            return;
        }
        ui->lcdNumber->display(10);
        ++currentQ;

        ui->textEdit->setText(list1.at(currentQ));
        ui->pushButton->setText(listA.at(currentQ));
        ui->pushButton_2->setText(listB.at(currentQ));
        ui->pushButton_3->setText(listC.at(currentQ));

        ui->pushButton->setEnabled(true);
        ui->pushButton_2->setEnabled(true);
        ui->pushButton_3->setEnabled(true);
        stop = false;
    }
}

void Widget::on_pushButton_clicked()
{
    if (stop)
        return;

    if(listD.at(currentQ) == 'A')
        score += 20;

    stop = true;

    ui->pushButton->setEnabled(false);
}

void Widget::on_pushButton_2_clicked()
{
    if (stop)
        return;

    if(listD.at(currentQ) == 'B')
        score += 20;

    stop = true;

    ui->pushButton_2->setEnabled(false);
}



void Widget::on_pushButton_3_clicked()
{
    if (stop)
       return;

    if(listD.at(currentQ) == 'C')
        score += 20;

    stop = true;
    ui->pushButton_3->setEnabled(false);
}



void Widget::showDatabaseDataSlot()
{
    this->db = QSqlDatabase::addDatabase("QMYSQL");             //打开数据库
    this->db.setHostName("localhost");
    this->db.setUserName("root");
    this->db.setPassword("960221");
    this->db.setDatabaseName("mydb");

    bool ok = db.open();
    if(ok)
    {
        qDebug()<<"open success";
    }
    else
    {
        qDebug()<<"error open";
    }
    QSqlQuery query;
    query.exec("select * from question order by rand() limit 5");             //随机从question里选取5个
     //query.exec("select *from question");                                   //选择question里所有内容
    while(query.next())
    {
        QString id = query.value(0).toString();
        listN.append(id);
        QString name = query.value(1).toString().toLocal8Bit();
        list1.append(name);
        QString A = query.value(2).toString().toLocal8Bit();
        listA.append(A);
        QString B = query.value(3).toString().toLocal8Bit();
        listB.append(B);
        QString C = query.value(4).toString().toLocal8Bit();
        listC.append(C);
        QString D = query.value(5).toString().toLocal8Bit();
        listD.append(D);
        qDebug()<<id<<name<<A<<B<<C<<D;
    }

    ui->textEdit->setText(list1.at(0));
    ui->pushButton->setText(listA.at(0));
    ui->pushButton_2->setText(listB.at(0));
    ui->pushButton_3->setText(listC.at(0));


    db.close();
}




void Widget::on_pushButton_5_clicked()
{
    close();
}

void Widget::paintEvent(QPaintEvent *event)
{

    // 画家
    QPainter p(this);  // 画家  this 是指以当前窗口为图纸 画图

    p.drawPixmap(0, 0, this->width(), this->height(), QPixmap(":/new/prefix1/图片/92_160141_0ff4d.jpg"));
}

最后实现的界面如下:(背景是小学时候玩的游戏,怀念一下)
这里写图片描述

这里写图片描述

这里写图片描述

其中遇到一些困难:
比如往数据库里插中文插不进去,其中需要将中文串加上toutf8的后缀

后面发现一款很实用的软件,navicat,就像xshell直接连linux一样,可以直接连数据库,非常方便,再也不用敲代码了

这里写图片描述

但是却发现汉字个数为奇数时在QT里显示乱码(这个真的是纠结了好久好久)
最后发现是数据库的问题,需要安装高版本。。

单机的大概就这样

  • 7
    点赞
  • 54
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值