PySide6 之自定义弹出框
一、效果图
二、示例代码
核心代码

class MyBaseDialog(QDialog): def __init__(self, parent = None): super().__init__(parent) self._hBoxLayout = QHBoxLayout(self) # 遮罩层 self.windowMask = QWidget(self) self.widget = QFrame(self, objectName='centerWidget') # 窗口无边框 self.setWindowFlags(Qt.WindowType.FramelessWindowHint) self.setAttribute(Qt.WidgetAttribute.WA_TranslucentBackground) # 设置与父窗口尺寸一直 self.setGeometry(0, 0, parent.width(), parent.height()) c = 0 self.windowMask.resize(self.size()) # 设置遮罩层背景色 self.windowMask.setStyleSheet(f'background:rgba({c}, {c}, {c}, 0.6)') self._hBoxLayout.addWidget(self.widget) # 装载事件过滤 self.window().installEventFilter(self) def showEvent(self, arg__1): return super().showEvent(arg__1) def closeEvent(self, arg__1): return super().closeEvent(arg__1) def resizeEvent(self, e): self.windowMask.resize(self.size()) '''事件过滤器,设置遮罩层与父窗口尺寸一样''' def eventFilter(self, obj, e: QEvent): if obj is self.window(): if e.type() == QEvent.Resize: re = QResizeEvent(e) self.resize(re.size()) return super().eventFilter(obj, e) class MyDialog(MyBaseDialog): yes_signal = Signal() cancel_signal = Signal() def __init__(self, title:str, content:str, parent=None): super().__init__(parent) self.content = content self.title_lable = QLabel(title, self.widget) self.content_label = QLabel(content, self.widget) self.yes_btn = QPushButton("确定",self.widget) self.cancel_btn = QPushButton("取消",self.widget) self.__init_ui() def __init_ui(self): # 设置组件位置 self.widget.setMaximumWidth(500) self.title_lable.move(24, 24) self.content_label.move(24, 56) self.content_label.adjustSize() self.widget.setFixedSize(48+self.content_label.width(), self.content_label.y() + self.content_label.height()+92) self.yes_btn.resize((self.widget.width() - 54) // 2, 32) self.cancel_btn.resize(self.yes_btn.width(), 32) self.yes_btn.move(24, self.widget.height()-56) self.cancel_btn.move( self.widget.width()-24-self.cancel_btn.width(), self.widget.height()-56) self.windowMask.setObjectName('windowMask') self.title_lable.setObjectName("title_label") self.content_label.setObjectName('content_lable') self.yes_btn.setObjectName("yes_btn") self.cancel_btn.setObjectName("cancel_btn") # 设置样式 self.widget.setStyleSheet( """ QWidget { background-color: white; border: 1px solid rgb(200, 200, 200); } QWidget#windowMask { background-color: rgba(255, 255, 255, 0.6); border: none; } QLabel { background-color: transparent; color: black; font-family: 'Segoe UI', 'Microsoft YaHei', 'PingFang SC'; border: none; } QLabel#title_lable { font-size: 18px; } QLabel#content_label { font-size: 14px; } QPushButton { background-color: rgb(204, 204, 204); font: 15px 'Segoe UI', 'Microsoft YaHei', 'PingFang SC'; border: transparent; } QPushButton:pressed:hover { background-color: rgb(153, 153, 153); } QPushButton:hover { background-color: rgb(230, 230, 230); } QPushButton:disabled { background-color: rgb(204, 204, 204); color: rgb(122, 122, 122); } """ ) self.yes_btn.clicked.connect(self.__click_yes) self.cancel_btn.clicked.connect(self.__click_cancel) def __click_yes(self): self.close() self.yes_signal.emit() def __click_cancel(self): self.close() self.cancel_signal.emit()
使用代码
from PySide6.QtWidgets import * from PySide6.QtCore import * from PySide6.QtGui import * import sys class Demo(QWidget): def __init__(self): super().__init__() self.init_ui() def init_ui(self): self.resize(500, 400) self.setWindowTitle("我的提示框") box = QHBoxLayout(self) btn1 = QPushButton("提示", self) btn1.clicked.connect(self.show_info) box.addWidget(btn1) box.setAlignment(Qt.AlignmentFlag.AlignLeft) def show_info(self): # 自己导入模块 d = MyDialog("提示", "我的提示框我的提示框", self) if d.exec(): print('确定按钮被点击') else: print("取消按钮被点击") # self.d.yes_signal.connect(lambda: print("确定按钮被点击")) # self.d.cancel_signal.connect(lambda: print("取消按钮被点击")) def show_warning(self): pass def resizeEvent(self, event): super().resizeEvent(event) if __name__ == '__main__': app = QApplication(sys.argv) d = Demo() d.show() app.exit(app.exec())