qt QWidget background layer 层次 猜想

69 篇文章 11 订阅

使用qt版本5.11.0 window10. 

 

经过试验,qt中的qwidget 的background 可以理解为至少有两个层次。

试验如下:

1、Qpainter 对QPixmap进行画图。

(wb.png)

QPixmap pix("E:/temp1/wb.png");
QPainter painter(&pix);
painter.fillRect(pix.rect(),QColor(0,255,0,100));
pix.save("E:/temp1/wb2.png");
painter.eraseRect(pix.rect());
painter.fillRect(pix.rect(),QColor(0,0,255,100));
pix.save("E:/temp1/wb3.png");

发现eraseRect 会将pixmap完全填充覆盖掉。

2、但是如果在qwidget的paintevent中做同样的操作。

QPainter painter1(this);
painter1.eraseRect(this->rect());
painter1.save();
painter1.fillRect(this->rect(),  QColor(255,0,0,100));
Widget::paintEvent(event);

却发现并没有将qwidget上的 控件甚至 初始时通过Qpalette设置的背景图片或颜色抹除掉。这说面 qpainter和qpixmap的行为有差异。另外看到的效果是,在原来的背景上添加了半透的红色(还能看到背景图),并且半透红色没有覆盖上面的组件,而组件是继承自QWidget ,所以组件又都具有相同的结构。

这里就说明底层是有两层buffer的,一层是systembuffer,一层是基于底层添加paintevent所绘制的buffer。然后再在上面有组件层。

setpalette其实并没有调用paintevent,但是却能够修改背景颜色,这是上面猜测之一。

 

setstylesheet最终会被解释成qstyle,qstyle貌似也是转换成qpalette起作用。最终都是更新systembuffer。setstylesheet 与setpalette 的区别是后者需要设置QWidget 或其子组件的setAutoFillBackground(true),前者如果是在qwidget中,需要在paintevent中 添加对应的代码,可以参考我前面的博文查看具体使用差异。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值