使用遮罩也相当简单:
class MyWidget(QWidget): """测试遮罩的显示效果 """ def __init__(self): super().__init__() # 设置白色背景,方便显示出遮罩 self.setStyleSheet('background:white;') main_layout = QVBoxLayout() button = QPushButton('点击显示对话框') button.clicked.connect(self.show_dialog) main_layout.addStretch(5) main_layout.addWidget(button, 1, Qt.AlignCenter) self.setLayout(main_layout) self.show() def show_dialog(self): dialog = QDialog(self) dialog.setModal(True) dialog_layout = QVBoxLayout() dialog_layout.addWidget(QLabel('<font color="red">mask test</font>')) dialog.setLayout(dialog_layout) mask = MaskWidget(self) mask.show() dialog.exec() mask.close() if __name__ == '__main__': app = QApplication(sys.argv) w = MyWidget() w.show() app.exec_()遮罩的使用分为如下个步骤:
根据需要遮盖的控件创建MaskWidget
显示遮罩
在模态对话框关闭后调用close()清除遮罩
之所以要在对话框显示之前先显示遮罩,是因为显示模态对话框后父窗口的事件循环被阻塞,这时所有对父窗口的操作都是被阻塞的,而对话框关闭后遮罩就被close了,父窗口的事件循环会将多次绘制事件智能的合并,所以遮罩可能根本不会被显示出来,因此我们必须在对话框前显示遮罩。(如果你好奇的话可以把两行代码的顺序对调,看看是否能正常显示遮罩控件)
这样我们的遮罩控件就完成了,运行程序: