Qt下等待对话框的设计

在Qt程序经常长时间操作时采用一个等待对话框来提示用户正在操作。
Qt有标准的QProcessDialog 能部分实现这个功能,但是缺点是要计算进度,二是用户可以中途取消。所以一般我们采用自定义对话框实现这个功能。

常见实现机制

开源项目 QtWaitingSpinner,具体可以下载代码一试,它是自己用代码描绘出进度条动态来了,因此可以调整出不同大小的环形等待标志
https://github.com/snowwlex/QtWaitingSpinner

这里写图片描述

但是他不是一个独立对话框,因此我们更多使用QMovie播放gif来实现对应功能

QWaitDialog对话框

其中的思路和素材来源于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;”);

最终效果
这里写图片描述

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值