当前位置: 首页 > news >正文

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 = 0self.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 = contentself.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

使用代码

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):passdef resizeEvent(self, event):super().resizeEvent(event)if __name__ == '__main__':app = QApplication(sys.argv)d = Demo()d.show()app.exit(app.exec())

 

http://www.hskmm.com/?act=detail&tid=15828

相关文章:

  • CF932E Team Work
  • HTTP3与HTTP2的性能对比
  • KubeSphere 社区版即将发布:开启云原生新篇章
  • 答题互动网页收藏
  • 芯脉:面向高速接口的SoC架构与完整性设计<3> - 教程
  • vscode插件开发,打包后不生效问题解决
  • streamlit构建dashboard
  • 力扣 338题 比特位计数
  • 企业服务管理是做什么的?-ManageEngine卓豪
  • 学习笔记_在Python中使用微信扫码功能(OpenCV WeChatQRCode)
  • 国标GB28181视频平台EasyCVR如何构建安防监控“中枢神经”?
  • vscode中element-plus组件无属性提示
  • day07
  • minio集群搭建
  • 在AI技术唾手可得的时代,挖掘新需求成为核心竞争力——某知名餐饮菜谱应用需求洞察
  • 英伟达入资 11Labs,黄仁勋:语音 AI 带来情感、共情和联结;Qwen3-TTS-Flash:多语言,多音色,多方言丨日报
  • 深入解析:一文详解回归分析的探索、分析、检验阶段,以Stata和SPSS为例
  • Vue 包依赖总结
  • 笔记_OpenCV4.5.1新增微信QRCode解码功能
  • 数字孪生 + 碳痕追踪:MyEMS 给能源管理装了套 “全链路全景导航”
  • 空间复杂度和时间复杂度
  • 基于IOS26的iOS 内存分析与必要内存界定
  • 破局 “节能不省钱” 悖论:开源 EMS 生态如何让中小企业用 1/3 成本实现能效跃升?
  • iOS 26 性能测试实战,如何评估启动速度、CPUGPU 负载、帧率与系统资源适配(uni-app 与 iOS 原生应用性能方案)
  • P14062 【MX-X21-T7】[IAMOI R5] 若我不曾见过太阳 题解
  • unity确定性帧同步框架
  • 03-堆和栈
  • 视频汇聚平台EasyCVR如何构建智慧农业监控监管系统?
  • 一套自用的git提交规范,可清晰的识别到关联的任务/bug - 实践
  • 撕开厂商锁定黑箱:MyEMS 如何用开源代码夺回能源管理的 “自主控制权”?