在Qt程序经常长时间操作时采用一个等待对话框来提示用户正在操作。
Qt有标准的QProcessDialog 能部分实现这个功能,但是缺点是要计算进度,二是用户可以中途取消。所以一般我们采用自定义对话框实现这个功能。
开源项目 QtWaitingSpinner,具体可以下载代码一试,它是自己用代码描绘出进度条动态来了,因此可以调整出不同大小的环形等待标志
https://github.com/snowwlex/QtWaitingSpinner
但是他不是一个独立对话框,因此我们更多使用QMovie播放gif来实现对应功能
其中的思路和素材来源于http://blog.csdn.net/liang19890820/article/details/9067679, 但这个只一个思路演示,我这里实现是完整代码,增加了圆角矩形背景
使用如下动画gif
这里还有一个gif 动画的制作和素材库 http://preloaders.net/
其中播放使用qgif库,完整 代码
QWaitDialog.h
#ifndef QWAITDIALOG_H
#define QWAITDIALOG_H
#include <QDialog>
#include <QLabel>
#include <QMovie>
#include <QFrame>
class QWaitDialog : public QDialog
{
Q_OBJECT
public:
explicit QWaitDialog(QWidget *parent,const QString &title);
~QWaitDialog();
private:
QMovie *movie;
QLabel *label;
QLabel * tip_label;
QFrame * background;
signals:
public slots:
};
#endif // QWAITDIALOG_H
QWaitDialog.cpp
#include "qwaitdialog.h"
QWaitDialog::QWaitDialog(QWidget *parent,const QString &title) :
QDialog(parent)
{
this->setFixedSize(100, 100);
//设置透明度
this->setWindowOpacity(0.8);
//取消对话框标题
this->setWindowFlags(Qt::FramelessWindowHint | Qt::Dialog);
this->setStyleSheet("background-color:transparent;");
//设置背景色为淡蓝色,顶层窗口做不出圆角来
background = new QFrame(this);
background->setStyleSheet("background-color: rgb(55, 135,215);border-radius:10px;");
background->setGeometry(0, 0, 100, 100);
label = new QLabel(background);
label->setStyleSheet("background-color:transparent;");
label->setGeometry(30, 15, 40, 40);
movie = new QMovie(":/resource/images/wait3.gif");
label->setScaledContents(true);
label->setMovie(movie);
tip_label = new QLabel(background);
tip_label->setText(title);
tip_label->setStyleSheet("color: white;background-color: transparent;");
tip_label->setGeometry(10, 70, 80, 20);
movie->start();
}
QWaitDialog::~QWaitDialog(){
delete label;
delete movie;
delete tip_label;
delete background;
}
其中,是我加的代码,主要实现用qss实现圆角窗口。这里不在对话框采用border-radius是因为这个属性对顶层窗口无效,只能先设对话框背景为透明,再上面铺一个圆角的QFrame,所有控件是加在
this->setWindowFlags(Qt::FramelessWindowHint | Qt::Dialog);
this->setStyleSheet(“background-color:transparent;”);background = new QFrame(this);
background->setStyleSheet(“background-color: rgb(55, 135,215);border-radius:10px;”);
最终效果
原文地址:http://blog.csdn.net/work4blue/article/details/45923601