Files
gdmp/toast.cpp
2025-09-25 16:56:53 +08:00

92 lines
3.0 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "toast.h"
#include <QDialog>
#include <QHBoxLayout>
#include <QLabel>
#include <QEvent>
class ToastDlg: public QDialog
{
private:
QLabel* mLabel;
QLabel* mCloseBtn;
protected:
bool eventFilter(QObject *obj, QEvent *ev) override
{
if (obj == mCloseBtn) {
if (ev->type() == QEvent::MouseButtonRelease) {
accept();
}
}
return QObject::eventFilter(obj, ev);
}
public:
ToastDlg()
{
auto layout = new QHBoxLayout;//水平布局
mLabel = new QLabel;
mLabel->setStyleSheet("color: white; background:transparent");//red
layout->addWidget(mLabel, 1);//stretch = 1
mCloseBtn = new QLabel;
//mCloseBtn->setPixmap(QPixmap(":/res/img/close.png"));
mCloseBtn->installEventFilter(this);
mCloseBtn->setStyleSheet("background:transparent");
layout->addWidget(mCloseBtn);
setLayout(layout);
setWindowFlag(Qt::FramelessWindowHint);//生成一个无边界窗口。用户不能通过窗口系统移动或调整无边界窗口的大小。
setAttribute(Qt::WA_ShowWithoutActivating, true); //Show the widget without making it active.
//setAttribute(Qt::WA_TranslucentBackground, true); // 背景透明
}
void show(Toast::Level level, const QString& text)
{
QPalette p = palette();
//QColor(int r, int g, int b, int a = 255)
//Constructs a color with the RGB value r, g, b, and the alpha-channel (transparency) value of a.
p.setColor(QPalette::Window, QColor(0, 0, 0, 200));
if (level == Toast::INFO) {
p.setColor(QPalette::Window, QColor(0x35, 0x79, 0xd5, 0x88));// 蓝色
} else if (level == Toast::WARN) {
p.setColor(QPalette::Window, QColor(0xff, 0xff, 0x33, 0x88));
} else { //ERROR
p.setColor(QPalette::Window, QColor(0xff, 0x0, 0x0, 0x88));
}
setPalette(p);//set widget's palette
mLabel->setText(text);
setWindowFlag(Qt::WindowStaysOnTopHint);//通知窗口系统该窗口应保持在所有其他窗口的顶部。
QDialog::show();
}
};//~class ToastDlg end
Toast::Toast()//构造函数
{
dlg_ = new ToastDlg;
}
//返回一个实例(instance)
Toast &Toast::instance()
{
static Toast thiz;//这种实例化方法会自动回收内存
return thiz;
}
void Toast::show(Toast::Level level, const QString &text)
{
dlg_->show(level, text);//ToastDlg.show方法
if (timer_id_ != 0) { //int mTimerId
//如果之前已经开启了一个定时器,先把他关掉
killTimer(timer_id_);
}
timer_id_ = startTimer(5000);//启动定时器每2s触发定时器事件直到调用killTimer
}
//重写定时器事件回调函数
void Toast::timerEvent(QTimerEvent *event)
{
killTimer(timer_id_);
timer_id_ = 0;
dlg_->accept();//隐藏模态对话框
//mDlg->hide();
}