# PyQt5==5.12
from PyQt5.QtCore import Qt, QPropertyAnimation, QSize, QTimer
from PyQt5.QtGui import QIcon, QPixmap, QPainter, QPaintEvent, QBrush
from PyQt5.QtWidgets import QMainWindow, QMessageBox, QStackedWidget, QDesktopWidget, QHBoxLayout, QWidget, QLabel, \
QSizePolicy, QFileDialog
class Toast(QWidget):
style = """#LabelMessage{color:white;font-family:Microsoft YaHei;}"""
def __init__(self, message='', timeout=2000, parent=None):
"""
@param message: 提示信息
@param timeout: 窗口显示时长
@param parent: 父窗口控件
"""
super(Toast, self).__init__()
self.parent = parent
# 除了成功之外其他消息图标一律使用错误图标(有局限性:成功的具体信息有很多种,但这里没办法区分,待改)
self.timer = QTimer()
# 由于不知道动画结束的事件,所以借助QTimer来关闭窗口,动画结束就关闭窗口,所以这里的事件要和动画时间一样
self.timer.singleShot(timeout, self.close) # singleShot表示timer只会启动一次
self.setWindowFlags(Qt.FramelessWindowHint | Qt.WindowStaysOnTopHint | Qt.SubWindow)
# self.setWindowOpacity(0.9) # 设置窗口透明度
self.setAttribute(Qt.WA_TranslucentBackground) # 设置窗口透明
self.setObjectName('Toast')
# self.setFixedSize(QSize(220, 100))
self.setMinimumSize(QSize(220, 100))
self.setMaximumSize(QSize(220, 180))
layout = QHBoxLayout()
layout.setContentsMargins(20, -1, 20, -1)
layout.setObjectName("HorizontalLayout")
self.setLayout(layout)
self.initUi(layout, message)
self.createAnimation(timeout)
self.setStyleSheet(Toast.style)
self.center()
def initUi(self, layout, message):
messageLabel = QLabel()
# 实现QLabel自动换行
sizePolicy = QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(messageLabel.sizePolicy().hasHeightForWidth())
messageLabel.setSizePolicy(sizePolicy)
messageLabel.setWordWrap(True)
messageLabel.setText(message)
messageLabel.setTextFormat(Qt.AutoText)
messageLabel.setScaledContents(True
pyqt -- 实现Toast/多页面跳转/弹框
于 2024-07-10 12:02:36 首次发布