当前位置: 首页 > 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.gsyq.cn/news/10889.html

相关文章:

  • HTTP3与HTTP2的性能对比
  • 芯脉:面向高速接口的SoC架构与完整性设计<3> - 教程
  • 学习笔记_在Python中使用微信扫码功能(OpenCV WeChatQRCode)
  • 国标GB28181视频平台EasyCVR如何构建安防监控“中枢神经”?
  • 在AI技术唾手可得的时代,挖掘新需求成为核心竞争力——某知名餐饮菜谱应用需求洞察
  • 深入解析:一文详解回归分析的探索、分析、检验阶段,以Stata和SPSS为例
  • Vue 包依赖总结
  • 笔记_OpenCV4.5.1新增微信QRCode解码功能
  • 完整教程:模电基础:基本放大电路及其优化
  • 空间复杂度和时间复杂度
  • 实用指南:U盘歌单管理器 (专业车载音乐播放列表制作工具)
  • iOS 26 性能测试实战,如何评估启动速度、CPUGPU 负载、帧率与系统资源适配(uni-app 与 iOS 原生应用性能方案)
  • unity确定性帧同步框架
  • 03-堆和栈
  • 2024 ICPC ECfinal E
  • 专业修复sqlserver master 数据库损坏。
  • C# Avalonia 15- Animation- ImageWipe
  • 题解:P8067 [BalkanOI 2012] balls
  • godot3.6字典遍历
  • 安装 elasticsearch-9.1.4的 IK分词器
  • 完整教程:ArcGIS JSAPI 高级教程 - ArcGIS Maps SDK for JavaScript - 自定义(GLSL)修改高亮图层样式
  • css `isolation: isolate` - 详解
  • JVM 类加载器详解 - 实践
  • Unity小游戏接入抖音敏感词检测 - 指南
  • 域渗透靶场-vulntarget-a综合靶场
  • 在K8S中,网络通信模式有哪些?
  • 一文教你搞定PASS 2025:样本量计算神器安装到使用全流程
  • React 18.2中采用React Router 6.4
  • 题解:AT_abc257_h [ABC257Ex] Dice Sum 2
  • ClickHouse UPDATE 机制详解 - 若