Files
gdmp/toast.cpp

92 lines
3.0 KiB
C++
Raw Permalink Normal View History

2025-09-25 16:56:53 +08:00
#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();
}