本帖主要纪录在项目过程中遇到的问题以及解决方案,开源代码在帖子最后的GitHub链接里(记得标星星哦)。
将高像素图片压缩为背景图片的方法
在项目开始阶段,我在网上找到了一个高清的图片。
然而它的像素是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);//使用画笔将图片画为背景。
完成后效果如下:
这里加入了一些按钮和无边框处理。
事件过滤器的应用
后期需要在界面内完成对文本框数据的读取和界面内信息的改变(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<QKeyEvent *>(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);
}
其中涉及到的文本事件,鼠标事件就不在此赘述了。
成品效果
起始界面:
选择界面:
测试界面(这里只展示加法):
总体功能如上。