效果如下:
我写的这个控件,唯一的特点就是不需要新建ui文件,直接使用纯代码实现,还带有阴影背景,代码如下:
h文件
class MyLoadMessage : public QDialog
{
Q_OBJECT
public:
//加载弹窗方式构建,timeSec为自动关闭时间(单位:s),-1表示不会自动关闭
explicit MyLoadMessage (const QString &text,int timeSec = -1,QWidget *parent = nullptr);
~MyLoadMessage (){
}
}
cpp文件
#include <QGraphicsDropShadowEffect>
#include <QMovie>
MyLoadMessage ::MyLoadMessage (const QString &text, int timeSec, QWidget *parent):
QDialog(parent)
{
//背景窗口设置
this->setAttribute(Qt::WA_TranslucentBackground, true); //设置窗体透明
this->setWindowFlags(Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint); //设置无边框
this->resize(561,206);
this->show();
//加载显示窗口
QWidget *widgetPtr = new QWidget(this);
widgetPtr->setMaximumSize(561,206);
widgetPtr->setStyleSheet(QString("QWidget{background:#F6FBFF;border-radius:4px;}"));
//设置显示窗口带背景阴影
QGraphicsDropShadowEffect *shadow = new QGraphicsDropShadowEffect(this);//实例阴影shadow
shadow->setOffset(0, 0); //设置阴影偏移
shadow->setColor(QColor("#444444")); //设置阴影颜色
shadow->setBlurRadius(18); //设置阴影圆角
widgetPtr->setGraphicsEffect(shadow); //给嵌套QWidget设置阴影
//设置背景窗口与显示窗口布局-格栅布局
QGridLayout *gridLayout = new QGridLayout(this);
gridLayout->addWidget(widgetPtr);
gridLayout->setMargin(20); //给布局器设置边距,设置宽度为阴影的宽度
this->setLayout(gridLayout);
//窗口子控件加载,加载gif显示
QLabel *labGif = new QLabel(widgetPtr);
QMovie *movie = new QMovie(this);
movie->setFileName(":/rs_Common/Images/MyMessageBox/loading.gif");
//movie->setScaledSize(labGif->size()); //自动缩放
labGif->setMovie(movie);
movie->start();
//加载显示的主体内容
QLabel *labText = new QLabel(text,widgetPtr);
labText->setMinimumSize(300,200);
labText->setWordWrap(true); //自动换行
labText->setStyleSheet(QString("QLabel{font:20px Microsoft YaHei;}"));
//子控件布局
QHBoxLayout *hBoxLayout = new QHBoxLayout(widgetPtr);
hBoxLayout->addSpacing(70);
hBoxLayout->addWidget(labGif);
hBoxLayout->addWidget(labText);
hBoxLayout->addSpacing(30);
//长时间未关闭,将自动释放关闭(默认不开启)
if(timeSec > 0)
QTimer::singleShot(timeSec*1000,this,[=](){
delete this;
});
}
使用方式:
//不会自动关闭
MyLoadMessage *load = new MyLoadMessage ("这是一个测试程序,测试加载弹窗");
//如果窗口60s未释放,将会自动释放关闭
MyLoadMessage *load = new MyLoadMessage ("这是一个测试程序,测试加载弹窗",60);