运行结果如下图
这个是图标
#ifndef TOASTWIDGET_H
#define TOASTWIDGET_H
#include <QWidget>
#include <QLabel>
#include <QPushButton>
#include <QTimer>
class ToastWidget : public QWidget
{
Q_OBJECT
public:
explicit ToastWidget(QWidget* parent = nullptr);
void showMessage(const QString& message, int duration = 3000, bool autoClose = true);
// 新增接口
void setIcon(const QPixmap& icon);
void setBackgroundColor(const QColor& color);
void setBorderColor(const QColor& color);
void setFontColor(const QColor& color);
void updatePosition();
private slots:
void closeToast();
protected:
void mousePressEvent(QMouseEvent* event) override;
void resizeEvent(QResizeEvent* event) override;
void paintEvent(QPaintEvent* event) override;
private:
QLabel* m_label;
QLabel* m_iconLabel;
QPushButton* m_closeButton;
QTimer* m_timer;
QColor m_backgroundColor;
QColor m_borderColor;
QColor m_fontColor;
//void updatePosition();
};
#endif // TOASTWIDGET_H
//.cpp
#include "ToastWidget.h"
#include <QHBoxLayout>
#include <QResizeEvent>
#include <QMouseEvent>
#include <QPainter>
ToastWidget::ToastWidget(QWidget* parent)
: QWidget(parent),
m_backgroundColor("#f6ffed"),
m_borderColor("#000000"),
m_fontColor("#333")
{
// 设置窗口标志为无边框和始终在顶层
setWindowFlags(Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint | Qt::Tool);
setAttribute(Qt::WA_TranslucentBackground);
setAttribute(Qt::WA_ShowWithoutActivating);
QHBoxLayout* mainLayout = new QHBoxLayout(this);
mainLayout->setContentsMargins(10, 5, 10, 5);
mainLayout->setSpacing(10);
m_iconLabel = new QLabel(this);
m_iconLabel->setPixmap(QPixmap(":/Image/blue-big.png").scaled(20, 20, Qt::KeepAspectRatio, Qt::SmoothTransformation));
m_label = new QLabel(this);
m_label->setStyleSheet(QString("QLabel { color: %1; font-size: 14px; }").arg(m_fontColor.name()));
m_closeButton = new QPushButton("×", this);
m_closeButton->setStyleSheet("QPushButton { background-color: transparent; color: #999; border: none; font-size: 16px; padding: 0; }"
"QPushButton:hover { color: #666; }");
m_closeButton->setFixedSize(20, 20);
m_closeButton->setCursor(Qt::PointingHandCursor);
connect(m_closeButton, &QPushButton::clicked, this, &ToastWidget::closeToast);
mainLayout->addWidget(m_iconLabel);
mainLayout->addWidget(m_label, 1);
mainLayout->addWidget(m_closeButton);
m_timer = new QTimer(this);
connect(m_timer, &QTimer::timeout, this, &ToastWidget::close);
int nwidth = width();
int nhight = height();
// resize(580,42);
hide();
}
void ToastWidget::showMessage(const QString& message, int duration, bool autoClose)
{
m_label->setText(message);
adjustSize();
updatePosition();
show();
if (autoClose) {
m_timer->start(duration);
m_closeButton->hide();
}
else {
m_timer->stop();
m_closeButton->show();
}
}
void ToastWidget::setIcon(const QPixmap& icon)
{
m_iconLabel->setPixmap(icon.scaled(20, 20, Qt::KeepAspectRatio, Qt::SmoothTransformation));
}
void ToastWidget::setBackgroundColor(const QColor& color)
{
m_backgroundColor = color;
update();
}
void ToastWidget::setBorderColor(const QColor& color)
{
m_borderColor = color;
update();
}
void ToastWidget::setFontColor(const QColor& color)
{
m_fontColor = color;
m_label->setStyleSheet(QString("QLabel { color: %1; font-size: 14px; }").arg(m_fontColor.name()));
}
void ToastWidget::mousePressEvent(QMouseEvent* event)
{
Q_UNUSED(event);
//close(); // 点击窗口的任何地方关闭窗口
}
void ToastWidget::resizeEvent(QResizeEvent* event)
{
QWidget::resizeEvent(event);
updatePosition();
}
void ToastWidget::paintEvent(QPaintEvent* event)
{
Q_UNUSED(event);
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing);
// 设置背景颜色
painter.setBrush(m_backgroundColor);
// 设置边框颜色和宽度
painter.setPen(QPen(m_borderColor, 1));
// 绘制圆角矩形
QRect rect = this->rect();
painter.drawRoundedRect(rect, 4, 4);
}
void ToastWidget::updatePosition()
{
if (parentWidget()) {
// 获取 MainWindow 的全局位置
//resize(580,42);
QPoint globalPos = parentWidget()->mapToGlobal(QPoint(0, 0));
QRect parentRect = parentWidget()->rect();
int x = globalPos.x() + parentRect.width() - width() ;
int y = globalPos.y() + parentRect.height() - height() ;
move(x, y);
}
}
void ToastWidget::closeToast()
{
close();
}
/构造调用
m_toastWidget = new ToastWidget(this);
m_toastWidget->setParent(this);
-----按钮调用
m_toastWidget->showMessage("This is an auto-close toast", 3000, true);
m_toastWidget->showMessage("This is a manual-close toast", 0, false);