92 lines
3.0 KiB
C++
92 lines
3.0 KiB
C++
|
|
#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();
|
|||
|
|
}
|