1. 当前位置:网站首页 > Python

支持Pyside6的Toast提示框类


Python C/S 第三方类

  • 搜索到网上大多是PyQT5的提示框类,不支持Pyside的方式,为此稍微修改了一般,经过测试已经可以支持Pyside
    效果
# coding=utf-8
from PySide6.QtWidgets import QWidget, QVBoxLayout, QPushButton, QHBoxLayout, QLabel, QSizePolicy
from PySide6.QtCore import QTimer, Qt, QSize, QPropertyAnimation
from PySide6.QtGui import QGuiApplication, QPaintEvent, QPainter, QBrush

class Toast(QWidget):
    style = """#LabelMessage{color:white;font-family:Microsoft YaHei;}"""

    def __init__(self, message='', timeout=1500, parent=None):
        """
        @param message: 提示信息
        @param timeout: 窗口显示时长
        @param parent: 父窗口控件
        """
        super().__init__(parent)
        self.parent = parent
        self.timer = QTimer()
        # 由于不知道动画结束的事件,所以借助QTimer来关闭窗口,动画结束就关闭窗口,所以这里的事件要和动画时间一样
        self.timer.singleShot(timeout, self.close)  # singleShot表示timer只会启动一次
        self.setWindowFlags(Qt.FramelessWindowHint | Qt.Tool | Qt.WindowStaysOnTopHint)
        self.setAttribute(Qt.WA_TranslucentBackground)  # 设置窗口透明
        self.setMinimumSize(QSize(220, 100))
        self.setMaximumSize(QSize(220, 180))
        self.layout = QHBoxLayout()
        self.layout.setContentsMargins(20, -1, 20, -1)
        self.setLayout(self.layout)
        self.animation = None
        self.init_ui(message)
        self.create_animation(timeout)
        self.setStyleSheet(Toast.style)
        # 调整位置
        self.center()

    def center(self):
        if self.parent is not None:
            toast_x = self.parent.x() + int((self.parent.width() - self.width()) / 2)
            toast_y = self.parent.y() + int((self.parent.height() - self.height()) / 2 + 40)
            self.move(toast_x, toast_y)
        else:
            screen = QGuiApplication.primaryScreen().size()
            size = self.geometry()
            self.move(int((screen.width() - size.width()) / 2),
                      int((screen.height() - size.height()) / 2) + 40)

    def init_ui(self, message):
        message_label = QLabel()
        size_policy = QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
        size_policy.setHorizontalStretch(0)
        size_policy.setVerticalStretch(0)
        size_policy.setHeightForWidth(message_label.sizePolicy().hasHeightForWidth())
        message_label.setSizePolicy(size_policy)
        message_label.setWordWrap(True)
        message_label.setText(message)
        message_label.setTextFormat(Qt.AutoText)
        message_label.setScaledContents(True)
        message_label.setObjectName("LabelMessage")
        message_label.setAlignment(Qt.AlignCenter)
        self.layout.addWidget(message_label)

    def create_animation(self, timeout):
        # 1.定义一个动画
        self.animation = QPropertyAnimation(self, b'windowOpacity')
        self.animation.setTargetObject(self)
        # 2.设置属性值
        self.animation.setStartValue(0)
        self.animation.setKeyValueAt(0.2, 0.7)  # 设置插值0.3 表示单本次动画时间的0.3处的时间点
        self.animation.setKeyValueAt(0.8, 0.7)  # 设置插值0.8 表示单本次动画时间的0.3处的时间点
        self.animation.setEndValue(0)
        # 3.设置时长
        self.animation.setDuration(timeout)
        # 4.启动动画
        self.animation.start()

    def paintEvent(self, a0: QPaintEvent):
        qp = QPainter()
        qp.begin(self)  # 不能掉,不然没效果
        qp.setRenderHints(QPainter.Antialiasing, True)  # 抗锯齿
        qp.setBrush(QBrush(Qt.black))
        qp.setPen(Qt.transparent)
        rect = self.rect()
        rect.setWidth(rect.width() - 1)
        rect.setHeight(rect.height() - 1)
        qp.drawRoundedRect(rect, 15, 15)
        qp.end()

class Window(QWidget):
    def __init__(self):
        super().__init__()
        self.resize(400, 400)
        layout = QVBoxLayout(self)
        layout.addWidget(QPushButton('显示Toast', self, clicked=self.show_toast))

    def show_toast(self):
        Toast("保存成功 Pyside6方式", parent=self).show()

if __name__ == '__main__':
    import sys
    from PySide6.QtWidgets import QApplication
    app = QApplication(sys.argv)
    w = Window()
    w.show()
    sys.exit(app.exec())

本文最后更新于2023-3-2,已超过 3个月没有更新,如果文章内容或图片资源失效,请留言反馈,我们会及时处理,谢谢!
版权说明

本文地址:http://www.liuyangdeboke.cn/?post=37
未标注转载均为本站远程,转载请注明文章出处:

发表评论


评论列表

chuan0144
chuan0144 2023-03-22 18:20回复
#1
学习,感谢!

联系我们

在线咨询:点击这里给我发消息

微信号:17721538135

工作日:9:00-23:00,节假日休息

扫码关注