本文为作者原创,转载请注明出处:https://www.cnblogs.com/apocelipes/p/10268108.html
本文索引
需求 原理 实现遮罩控件 遮罩的使用
需求
原理
background
属性是少数几个能被子控件继承的属性,当我们修改了父窗口的QSS那么我们的对话框也将不可避免的遭受影响,虽然可以使用setStyleSheet('')
去除这些额外的影响,但是这样做将会引入许多不必要的复杂性,显然是与我们的设计初衷相违背的。QWidget
的特性,当除了QDialog
以外的控件设置了非None
的parent时,该控件就会绘制在parent控件上。布局管理器只是帮助我们设置了parent并自动指定了一个合适的位置和尺寸来绘制控件,所以我们完全可以自己指定控件的大小和需要绘制的区域。QWidget
的逻辑坐标。与painter使用的坐标系统一致。所以我们只需要设置遮罩组件的parent为父窗口,然后获取父窗口的高度和宽度,并设置遮罩组件的大小与父窗口一致,最后从父窗口逻辑坐标系的(0, 0)
出开始绘制控件即可保证遮罩控件可以完整的遮盖住父窗口实现遮罩效果。geometry
和setGeometry
接口,通过它们就可以方便的控制widgets的形状和位置而不用担心出错。实现遮罩控件
self.setAttribute(Qt.WA_StyledBackground)
这一行,自定义控件只有设置该属性后才能正常设置背景。255 * 0.4 = 102
,最终的结果就是rgba(255, 0, 0, 102)
,设置完成后控件就拥有了半透明效果。show
方法上。光设置了颜色和透明度还不够,我们还要让控件正确地遮盖住parent。为了达到这一目的,我们先获取parent的geometry,然后使用self.setGeometry(0, 0, parent_rect.width(), parent_rect.height())
将控件设置到与parent重合(原理参考上一节内容)。而如果我们没有给控件设置parent,那么控件什么也不会做,因为控件本身需要依赖于parent,如果没有的话也就没法正常显示了。之后再使用QWidget.show()
就可以显示我们的遮罩效果了。遮罩的使用
根据需要遮盖的控件创建MaskWidget 显示遮罩 在模态对话框关闭后调用 close()
清除遮罩

还没有评论,来说两句吧...