注释:在项目中经常会适应等待对话框,显示任务的状态今天在这里实现等待对话框的动态显示!
#pragma
once
头文件
#include
"PWaitingDialog.h"
//透明等待框
namespace puic
{
class CPWaitingDialog : public QDialog
{
public:
//isWidget是否作为一个子控件显示(不是单独的对话框)
CPWaitingDialog(QWidget* parent = nullptr, bool isWidget = false);
protected:
virtual void showEvent(QShowEvent * event);
virtual void hideEvent(QHideEvent * event);
virtual void closeEvent(QCloseEvent * event);
private:
QLabel* _iconLabel;
QMovie* _movie;
bool _isWidget;
};
}
#include
"stdafx.h"
#include "PWaitingDialog.h"
namespace puic
{
CPWaitingDialog::CPWaitingDialog(QWidget* parent,
bool isWidget)
: QDialog(parent),
_iconLabel(new QLabel(this)),
_movie(nullptr),
_isWidget(isWidget)
{
if (_isWidget) {
setWindowFlags(Qt::Widget);
}
else {
setWindowFlags(windowFlags() | Qt::FramelessWindowHint |
Qt::WindowStaysOnTopHint);
}
setFixedSize(QSize(70, 70));
setAttribute(Qt::WA_TranslucentBackground, true);
setStyleSheet("background-color:rgba(255,255,255,0%);");
QHBoxLayout* layout = new QHBoxLayout();
layout->setContentsMargins(0, 0, 0, 0);
_iconLabel->setScaledContents(true);
layout->addWidget(_iconLabel);
_movie = new QMovie(":/puic/styles/icons/progress/waiting_dot.gif");
connect(_movie, &QMovie::frameChanged, this, [this](int frameNumber){
_iconLabel->setPixmap(_movie->currentPixmap());
});
setLayout(layout);
}
void CPWaitingDialog::showEvent(QShowEvent * event)
{
if (!_isWidget) {
QWidget* parent = parentWidget();
if (parent) {
//再次显示时,在父窗口的居中显示
QPoint ppos = parent->pos();
int tx = ppos.x() + (parent->width() - this->width()) / 2;
int ty = ppos.y() + (parent->height() - this->height()) / 2;
move(tx, ty);
}
}
_movie->start();
QWidget::showEvent(event);
}
void CPWaitingDialog::hideEvent(QHideEvent * event)
{
_movie->stop();
QWidget::hideEvent(event);
}
void CPWaitingDialog::closeEvent(QCloseEvent * event)
{
_movie->stop();
QWidget::closeEvent(event);
}
}
#include
<QApplication>
#include "PWaitingDialog.h"
using namespacing puic;
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
CPWaitingDialog w;
w.show();
return a.exec();
}