一、W004.h
cpp
#ifndef W004_H
#define W004_H
#include <QWidget>
#include<QTimer>
#include<QDateTime>
class W004 : public QWidget
{
Q_OBJECT
public:
W004(QWidget *parent = nullptr);
~W004();
private:
QDateTime StartTime;
QTimer *TTT;
};
#endif // W004_H
二、W004.cpp
cpp
#include<QDateTime>
#include<QDir>
#include<QFile>
#include "w004.h"
#include<QGuiApplication>
#include<QScreen>
#include <QRandomGenerator>
#include<QChar>
#include<QLabel>
#include<QLineEdit>
#include<qmath.h>
#include<QDebug>
#include<QComboBox>
#include<QPushButton>
#include<QGroupBox>
#include<QFont>
#include"Cacler.h"
#include<QList>
#include<QTimer>
W004::W004(QWidget *parent)
: QWidget(parent)
{
TTT = new QTimer(this);
TTT->setInterval(1000);
TTT->stop();
QChar opList[]={'+','-'};
setFixedSize(370,900);
setWindowTitle("数学练习(0-10)加减法");
QLabel * l1=new QLabel("题目量:",this);
l1->resize(50,45);
l1->move(10,0);
l1->setAlignment(Qt::AlignVCenter);
QComboBox *c1=new QComboBox(this);
c1->resize(60,45);
c1->move(70,0);
c1->addItems({"5","10","15","20"});
c1->setFont(QFont("黑体",12));
QLabel * l2=new QLabel("运算量:",this);
l2->resize(50,45);
l2->move(140,0);
l2->setAlignment(Qt::AlignVCenter);
QComboBox *c2=new QComboBox(this);
c2->resize(60,45);
c2->move(210,0);
c2->addItems({"1","2","3","4","5","6","7","8","9","10"});
c2->setFont(QFont("黑体",12));
QPushButton * btnsel=new QPushButton("生成",this);
btnsel->resize(80,45);
btnsel->move(280,0);
btnsel->setFont(QFont("黑体",12));
QGroupBox *grp =new QGroupBox("练习题",this);
grp->resize(350,this->height()-10-40);
grp->move(10,40);
this->move(QGuiApplication::primaryScreen()->size().width()/2-this->width()/2,
QGuiApplication::primaryScreen()->size().height()/2-this->height()/2);
for (int var = 0; var < 20; var++) {
QLabel * Tl=new QLabel("-",grp);
Tl->resize(270,37);
Tl->move(10,20+var*38);
Tl->setProperty("qName","L"+QString::number(var));
if(var%2==0)
Tl->setStyleSheet("QLabel { border : 1px solid white; }");
else
Tl->setStyleSheet("QLabel { border : 1px solid gray; }");
Tl->setFont(QFont("黑体",16));
Tl->setAlignment(Qt::AlignRight|Qt::AlignVCenter);
// qDebug() << var << Tl->property("qName");
QLineEdit *Tt=new QLineEdit("",grp);
Tt->resize(50,37);
Tt->move(290,20+var*38);
Tt->setProperty("qName","T"+QString::number(var));
Tt->setProperty("qResult","");
Tt->setFont(QFont("黑体",15));
//Tt->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
//Tt->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
Tt->setAlignment(Qt::AlignLeft|Qt::AlignVCenter);
// qDebug() <<var<< Tt->property("qName");
}
QLabel * TR=new QLabel("0",grp);
TR->resize(180,50);
TR->setAlignment(Qt::AlignVCenter|Qt::AlignCenter);//
TR->move(10,grp->height()-60);
TR->setProperty("Name","Result");
TR->setFont(QFont("黑体",12));
// TR->setStyleSheet("QLabel { border : 1px solid dimgray; }");
QLabel * TR1=new QLabel("0",grp);
TR1->resize(50,50);
TR1->setAlignment(Qt::AlignVCenter|Qt::AlignCenter);//
TR1->move(190,grp->height()-60);
TR1->setProperty("Name","Result");
TR1->setFont(QFont("黑体",20));
TR1->setStyleSheet("QLabel { color: blank; }");
QPushButton * btnPing=new QPushButton("评分",grp);
btnPing->resize(95,50);
btnPing->setFont(QFont("黑体",18));
btnPing->move(245,grp->height()-60);
btnsel->setEnabled(true);
btnPing->setEnabled(false);
connect(btnsel,&QPushButton::clicked,this,[=](){
const QObjectList& cls=grp->children();
int rows=c1->currentText().toInt();
int ops=c2->currentText().toInt();
TR->setText("");
TR1->setText("");
TR1->setStyleSheet("QLabel { color: blank; }");
Cacler cl;
for(int i=0;i<20;i++)
{
if(i<rows)
{
QString tm;
int b=QRandomGenerator::global()->bounded(0,1);
int a=0;
for(int j=0;j<ops;j++)
{
a=QRandomGenerator::global()->bounded(0,10);
tm.append(QString::number(a));
tm.append(opList[b]);
b=QRandomGenerator::global()->bounded(0,1);
}
a=QRandomGenerator::global()->bounded(0,10);
tm.append(QString::number(a));
QString tr=cl.Cacle(tm);
for(QObject *var : cls) {
// qDebug() << i << var->property("qName");
if(var->property("qName")==("L"+QString::number(i)))
{
QLabel * l1= qobject_cast<QLabel*>(var);
l1->setText(tm+"=");
}
else if(var->property("qName")==("T"+QString::number(i)))
{
QLineEdit *t1= qobject_cast<QLineEdit*>(var);
t1->setProperty("qResult",tr);
t1->setProperty("qQuest",tm);
t1->setStyleSheet("QLineEdit { color: black; }");
t1->setText("");
}
}
}
else
{
for(QObject *var : cls) {
// qDebug() << i << var->property("Name");
if(var->property("Name")==("L"+QString::number(i)))
{
QLabel * l1= qobject_cast<QLabel*>(var);
l1->setText("-");
}
else if(var->property("Name")==("T"+QString::number(i)))
{
QLineEdit *t1= qobject_cast<QLineEdit*>(var);
t1->setProperty("Result","");
}
}
}
}
StartTime=QDateTime::currentDateTime();
TTT->start();
btnsel->setEnabled(false);
btnPing->setEnabled(true);
c1->setEnabled(false);
c2->setEnabled(false);
});
connect(btnPing,&QPushButton::clicked,this,[=](){
const QObjectList& cls=grp->children();
int rows=c1->currentText().toInt();
double onefen=100/rows;
int rr=0;
int nr=0;
double sumfen=0;
TTT->stop();
QDateTime EndTime=QDateTime::currentDateTime();
QString data;
data.append(StartTime.toString("yyyy-MM-dd HH:mm:ss")+"至");
data.append(EndTime.toString("yyyy-MM-dd HH:mm:ss")+"\r\n训练日志:\r\n");
for(int i=0;i<20;i++)
{
for(QObject *var : cls) {
if(var->property("qName")==("T"+QString::number(i)))
{
qDebug() << i << var->property("qName");
QLineEdit *t1= qobject_cast<QLineEdit*>(var);
QString r1=t1->property("qResult").toString();
QString r2=t1->text();
if(r1!="")
{
if(r1.toInt()==r2.toInt())
{
rr+=1;
sumfen+=onefen;
t1->setStyleSheet("QLineEdit { color: green; }");
}
else
{
nr+=1;
t1->setStyleSheet("QLineEdit { color: red; }");
data.append("错题:"+t1->property("qQuest").toString()+" = "+r1+" 填"+r2+"\r\n");
}
}
}
}
}
TR->setText("正确:"+QString::number(rr)+",错误:"+QString::number(nr)+"\n正确率:"+
QString::number(rr*100.0/(rr+nr))+"%,用时:"+QString::number(StartTime.secsTo(EndTime))+"秒");
TR1->setText(QString::number(sumfen));
data.append("训练结果:"+TR->text().toUtf8()+"\r\n总分:"+TR1->text().toUtf8()+"\r\n");
if(sumfen>=80)
TR1->setStyleSheet("QLabel { color: green; }");
else
TR1->setStyleSheet("QLabel { color: red; }");
data.append("用时:"+QString::number(StartTime.secsTo(EndTime))+"秒");
QFile f(QDir::currentPath()+"/Result.txt");
f.open(QIODevice::Append);
f.write(data.toUtf8());
f.close();
btnPing->setEnabled(false);
btnsel->setEnabled(true);
c1->setEnabled(true);
c2->setEnabled(true);
});
connect(TTT,&QTimer::timeout,[=](){
if(!btnsel->isEnabled())
{
TR1->setText(QString::number(StartTime.secsTo(QDateTime::currentDateTime())));
}
});
}
W004::~W004()
{
}
三、第三个程序计算模块,这不传了。
四、main.cpp
cpp
#include "w004.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
W004 w;
w.show();
return a.exec();
}
五、软件截图
1、
2、
3、
4、
5、稍做变化:0-10加减乘除法
cpp
QChar opList[]={'+','-','*','/'};//加入四则运算符变成四个
cpp
QString tm;
int b=QRandomGenerator::global()->bounded(0,4);//随机数也取在0-3
int a=0;
for(int j=0;j<ops;j++)
{
a=QRandomGenerator::global()->bounded(0,10);
tm.append(QString::number(a));
tm.append(opList[b]);
b=QRandomGenerator::global()->bounded(0,4);//随机数也取在0-3
}
6、效果图如下

7、坚持精益求精的态度。改进了显示效果和细节内容 :
