1.圆角矩形bug描述:

Qt使用样式表border0-radius:height/2时会在显示宽度小于高度的一半时显示为正常矩形,这不符合圆角矩形的需求,这个问题是Qt的一个bug,至今还未修复,问题的本质原因是进度变化时,会导致宽度变化,宽度变化到一定时候会导致样式表无效,现有一种基于实时绘制的方法解决该问题。

1.1圆角矩形bug图样预览:

当进度值小于进度条高度的一半时,会出现方形矩形边 bugLoading.gif

1.2解决方案

先在窗体上放置一个Frame,设置Frame的样式和背景色作为进度条的背景色,之后在该Frame上开始绘制进度的前景色,设置绘图绘制的路径为圆角矩形,则不会出现方角的矩形边框。

2核心代码

2.1绘制进度条背景色

在Frame中绘制背景色,并设置圆角,代码如下

void Progress::paintEvent(QPaintEvent *event){
    Q_UNUSED(event);	//声明一下,不会会报警告
    QPainter Paint(this);	//设置当前绘制的绘图设备是当前窗体
	Paint.save();
	Paint.setBrush(QColor("#5F5D5D")); //设置进度的背景色
	Paint.setPen(Qt::NoPen);
	Paint.drawRoundedRect(this->rect(),44,44);//绘制背景,背景的宽度和当前窗体的宽度高度一致的圆角矩形,需要设置当前窗体的背景透明
	Paint.restore();
}
2.2绘制前景色
void PaintFontColor(QPainter &Paint){
    Paint.save();
	Paint.setPen(Qt::NoPen); //设置无画笔,不需要轮廓线
	Paint.setRenderHints(QPainter::TextAntialiasing | QPainter::Antialiasing);//设置文本与绘图抗锯齿
	Paint.setBrush(QColor("#009B4C"));//设置前景色
	QPainterPath paintPath;		//声明一个绘图路径
	paintPath.addRoundedRect(this->rect(),44,44);//添加一个圆角矩形,44为高度的一半
	Paint.setClipPath(paintPath);//设置绘制时裁切出路径,这样就不会画出圆角矩形以外的东西
	QRect rect(QRect(0,0,mValue,88));//mValue为当前的进度值
	Paint.drawRect(rect);//绘制前景
	Paint.restore();
}
2.3绘制进度文本
void PaintText(QPainter &Paint){
    Paint.save();
 	Paint.setBrush(QColor("#FFFFFF"));//设置文本颜色
 	Paint.setFont(QFont("Arial",25,50)); //设置字体类型和大小
	Paint.drawText(QPointF(this->width()/2-30,55),QString("%1%").arg(mValue/10));//定位绘制的定位矩形并绘制文本
	Paint.restore();
}

3.解决bug之后的进度条预览

okLoading.gif

4.小知识分享

  • 在QtCreator中使用Ctrl+Tab键组合可以快速地在多个Cpp文件中切换
  • 在uidesigner中通过右键当前类,可以将当前类提升为一个自定义类,直接在uidesigner中使用,这样两个对象通信时可以不适用信号槽,直接通过ui->xxx的方式直接访问对象属性
  • 点击当前窗口部件,当手指移出该部件时,焦点不会自动切换,此时移动鼠标,虽然已经不在该部件上,但是事件处理还是在该部件,因此当移出时需要忽略事件响应,可以这样操作
if(mFrame->rect().contains(event->pos()))
{
  //xxxxxxxxx
 }