PySide6 之自定义弹出框

一、效果图

image

二、示例代码

核心代码

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()
View Code

使用代码

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())

 

posted @ 2025-09-24 14:50  样子2018  阅读(4)  评论(0)    收藏  举报