1.圆角矩形bug描述:
Qt使用样式表
border0-radius:height/2
时会在显示宽度小于高度的一半时显示为正常矩形,这不符合圆角矩形的需求,这个问题是Qt的一个bug,至今还未修复,问题的本质原因是进度变化时,会导致宽度变化,宽度变化到一定时候会导致样式表无效,现有一种基于实时绘制的方法解决该问题。
1.1圆角矩形bug图样预览:
当进度值小于进度条高度的一半时,会出现方形矩形边
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之后的进度条预览
4.小知识分享
- 在QtCreator中使用Ctrl+Tab键组合可以快速地在多个Cpp文件中切换
- 在uidesigner中通过右键当前类,可以将当前类提升为一个自定义类,直接在uidesigner中使用,这样两个对象通信时可以不适用信号槽,直接通过ui->xxx的方式直接访问对象属性
- 点击当前窗口部件,当手指移出该部件时,焦点不会自动切换,此时移动鼠标,虽然已经不在该部件上,但是事件处理还是在该部件,因此当移出时需要忽略事件响应,可以这样操作
if(mFrame->rect().contains(event->pos()))
{
//xxxxxxxxx
}
有什么问题可以在线讨论,觉得有用帮忙点个赞吧!^ _ ^