基于Qt、C++的小学数学测试软件

本帖主要纪录在项目过程中遇到的问题以及解决方案,开源代码在帖子最后的GitHub链接里(记得标星星哦)。

将高像素图片压缩为背景图片的方法

在项目开始阶段,我在网上找到了一个高清的图片。

基于Qt、C++的小学数学测试软件_第1张图片

然而它的像素是5000*3000左右的,显然我们不能在Windows界面申请如此大的窗口,这里提供两种压缩图片及将其作为背景的方法。
首先将图片载入:

QPixmap pixmap;
pixmap.load("url");  //图片路径

这里提供两种方式:

饱和填充

QPixmap fitpixmap = pixmap.scaled(ui->label->width(), ui->label->height(), Qt::IgnoreAspectRatio, Qt::SmoothTransformation);  // 饱满填充

按比例填充

QPixmap fitpixmap = pixmap.scaled(ui->label->width(), ui->label->height(), Qt::KeepAspectRatio, Qt::SmoothTransformation);  // 按比例缩放

这里我们采用饱和填充,之后我们再申请画笔,将图片画出即可。

    QPainter painter(this);
    QPixmap pix=QPixmap(fitpixmap);
    painter.drawPixmap(0,0,pix);//使用画笔将图片画为背景。

完成后效果如下:
基于Qt、C++的小学数学测试软件_第2张图片这里加入了一些按钮和无边框处理。

事件过滤器的应用

后期需要在界面内完成对文本框数据的读取和界面内信息的改变(label内信息的改变),这时需要在Text Edit和label上应用事件过滤器。

tishi->installEventFilter(this);//类似这样

事件过滤器在函数

eventFilter(QObject *target,QEvent *event)

内部实现。
其具体为:

bool DivWindow::eventFilter(QObject *target,QEvent *event)
{
    if(target == this->daan)
    {
        if(event->type()==QEvent::KeyPress)
        {
            QKeyEvent *k=static_cast(event);
            if(k->key()==Qt::Key_Return||k->key()==Qt::Key_Enter)
            {
                QString tempdaan=daan->toPlainText();
                daan->clear();
                answer=tempdaan.toUInt();
                if(qAbs(answer-(double)number1/number2)<=0.1)
                {
                    flag++;
                    QMessageBox::information(this,"答案反馈","回答正确");
                    getRandomNumber();
                    QString labeltext;
                    labeltext="题目:"+QString::number(number1,10)+"➗"+QString::number(number2,10)+"=";
                    timu->setText(labeltext);
                }
                else
                {
                    QString labeltext;
                    labeltext="回答错误,正确答案为"+QString::number((double)number1/number2,10,2);
                    QMessageBox::information(this,"答案反馈",labeltext);
                    getRandomNumber();
                    labeltext="题目:"+QString::number(number1,10)+"➗"+QString::number(number2,10)+"=";
                    timu->setText(labeltext);
                }
                if(flag==11&&rank<3)
                {
                    QMessageBox::information(this,"提示","难度升级");
                    rank++;
                    flag=1;
                }
                QString information;
                information="难度等级:"+QString::number(rank,10)+" 累计回答正确题目个数:"+QString::number(flag-1,10);
                tishi->setText(information);
            }
        }
    }

    return QWidget::eventFilter(target,event);
}

其中涉及到的文本事件,鼠标事件就不在此赘述了。

成品效果

起始界面:
基于Qt、C++的小学数学测试软件_第3张图片选择界面:
基于Qt、C++的小学数学测试软件_第4张图片测试界面(这里只展示加法):
基于Qt、C++的小学数学测试软件_第5张图片基于Qt、C++的小学数学测试软件_第6张图片基于Qt、C++的小学数学测试软件_第7张图片总体功能如上。

最后附上本项目GitHub地址(记得标星星呀):链接: link.

你可能感兴趣的:(qt5,c++)