有客自远方来52 2024-02-17 16:05 采纳率: 15.3%
浏览 52
已结题

在python中如何实现qt的QMessageBox消息弹窗的无边框和透明背景(开发工具-pycharm)

以下是相关代码和结果图片,该怎么实现无边框和透明背景

import sys

from PyQt6 import QtCore, QtWidgets
from PyQt6.QtCore import Qt
from PyQt6.QtWidgets import QWidget, QApplication, QMessageBox


class Ui_Form(QWidget):

    def __init__(self):
        super(Ui_Form, self).__init__()
        self.setWindowFlag(QtCore.Qt.WindowType.MSWindowsFixedSizeDialogHint)  # 显示最小化和关闭按钮
        self.setupUi(self)
        self.setWindowFlags(Qt.WindowType.FramelessWindowHint)

    def setupUi(self, Form):
        Form.setObjectName("Form")
        Form.resize(400, 300)
        self.frame = QtWidgets.QFrame(parent=Form)
        self.frame.setGeometry(QtCore.QRect(0, 0, 401, 301))

        self.frame.setFrameShape(QtWidgets.QFrame.Shape.StyledPanel)
        self.frame.setFrameShadow(QtWidgets.QFrame.Shadow.Raised)
        self.frame.setObjectName("frame")
        self.frame_2 = QtWidgets.QFrame(parent=self.frame)
        self.frame_2.setGeometry(QtCore.QRect(0, 0, 401, 311))
        self.frame_2.setStyleSheet("background-color: rgba(199, 199, 199, 50);\n")
        self.frame_2.setFrameShape(QtWidgets.QFrame.Shape.StyledPanel)
        self.frame_2.setFrameShadow(QtWidgets.QFrame.Shadow.Raised)
        self.frame_2.setObjectName("frame_2")
        self.label = QtWidgets.QLabel(parent=self.frame_2)
        self.label.setGeometry(QtCore.QRect(60, 90, 291, 31))

        self.label.setObjectName("label")
        self.pushButton = QtWidgets.QPushButton(parent=self.frame_2)
        self.pushButton.setGeometry(QtCore.QRect(150, 190, 75, 24))

        self.pushButton.setObjectName("pushButton")

        # 按钮点击事件绑定槽函数
        self.pushButton.clicked.connect(self.push)

        self.retranslateUi(Form)
        QtCore.QMetaObject.connectSlotsByName(Form)

    def retranslateUi(self, Form):
        _translate = QtCore.QCoreApplication.translate
        Form.setWindowTitle(_translate("Form", "主题更换"))
        self.label.setText(_translate("Form", "亲,主题还没开发出来哦~,嘻嘻"))
        self.pushButton.setText(_translate("Form", "没关系"))

    def push(self):
        QMessageBox.information(None, '系统提示', '你是个好人!'

img

  • 写回答

4条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2024-02-17 16:06
    关注

    引自免费微信小程序:皆我百晓生

    在 PyQt6 中,要实现 QMessageBox 的无边框和透明背景,需要对其实现自定义样式表(QSS)以及使用窗口属性来移除边框。然而,直接对 QMessageBox 进行无边框和透明背景设置并不方便,因为它是模态对话框且其设计初衷并未考虑这些定制。但我们可以创建一个自定义的对话框类,模拟 QMessageBox 的行为,并对其进行相应的样式定制。

    以下是一个例子,展示了如何创建一个具有透明背景和无边框的自定义消息弹窗:

    import sys
    from PyQt6.QtCore import Qt, QSize
    from PyQt6.QtWidgets import QApplication, QWidget, QVBoxLayout, QLabel, QPushButton, QMessageBox
    
    class CustomMessageBox(QWidget):
        def __init__(self, title: str, text: str, parent=None):
            super().__init__(parent=parent)
            self.setWindowFlags(Qt.WindowType.FramelessWindowHint)  # 移除边框
            self.setAttribute(Qt.WidgetAttribute.WA_TranslucentBackground)  # 使背景变为半透明
    
            layout = QVBoxLayout(self)
            layout.setAlignment(Qt.AlignmentFlag.AlignCenter)
    
            # 标题标签
            title_label = QLabel(title, self)
            title_label.setStyleSheet("font-size: 14pt; font-weight: bold; color: white;")
            layout.addWidget(title_label)
    
            # 文本信息标签
            text_label = QLabel(text, self)
            text_label.setStyleSheet("color: white;")
            layout.addWidget(text_label)
    
            # 按钮布局
            buttons_layout = QHBoxLayout()
            ok_button = QPushButton("确定")
            ok_button.clicked.connect(self.close)
            buttons_layout.addWidget(ok_button)
            layout.addLayout(buttons_layout)
    
            self.resize(QSize(300, 150))  # 自定义尺寸
    
        def paintEvent(self, event):
            painter = QPainter(self)
            painter.fillRect(event.rect(), QBrush(QColor(0, 0, 0, 150)))  # 设置背景颜色为半透明黑色
    
    def show_custom_message_box(title, message):
        app = QApplication(sys.argv)
        msg_box = CustomMessageBox(title, message)
        msg_box.show()
        sys.exit(app.exec())
    
    # 使用示例
    show_custom_message_box('系统提示', '你是个好人!')
    
    # 如果你想在按钮点击事件中调用这个自定义消息框
    # class Ui_Form(QWidget):
    #     ...
    #     def push(self):
    #         show_custom_message_box('系统提示', '你是个好人!')
    

    请注意,上述代码中,我们没有使用原始的 QMessageBox 类,而是创建了一个继承自 QWidget 的自定义对话框类 CustomMessageBox,并为其设置了无边框、半透明背景以及其他基本元素。根据你的需求,你可以进一步调整样式和布局以达到理想效果。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 2月25日
  • 已采纳回答 2月17日
  • 创建了问题 2月17日