在用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里显示乱码(这个真的是纠结了好久好久)
最后发现是数据库的问题,需要安装高版本。。
单机的大概就这样