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;”);

最终效果

时间: 2025-01-05 05:56:29

Qt下等待对话框的设计的相关文章

第48课 替换对话框的设计与实现

1. 替换对话框需求分析 (1)可复用的软件部件 (2)查找文本框中的指定字符串 (3)替换单个指定字符串 (4)替换所有指定字符串 (5)附加需求:点击"关闭"按钮后隐藏 2. 替换对话框的设计与实现 (1)继承类图 (2)界面布局 3. 替换算法流程图 4. MainWindow与ReplaceDialog之间的关系 [编程实现]替换功能的实现 //main.cpp与上例相同 #include "MainWindow.h" #include <QAppli

Qt下的简易计算器项目

Qt是一个比较强大的跨平台软件,首次认真学习Qt就拿计算机项目来入门. 在Qt中创建好项目,在设计模式下利用Qt的表格布局,设计好界面 其中可以利用样式表改动界面属性 利用Qt中的信号与槽编写功能程序 1 #include "mainwindow.h" 2 #include "ui_mainwindow.h" 3 4 MainWindow::MainWindow(QWidget *parent) : 5 QMainWindow(parent), 6 ui(new U

等待对话框实现

在使用Winform开发程序时,经常会碰到一些耗时操作,如果不加处理的话,第一用户体验不好,第二如果操作会造成程序卡死.所以在这类情况下就要使用进度框来使程序在处理的同时显示一个进度框,效果截图如下: 如上这种方式显示进度框.但是显示进度框的时候也要同时阻断用户对窗体的操作,所以当进度框显示时可使用IMessageFilter的方式来过滤窗体消息,这样就可以达到类似模态对话框的目的,而进度对话框的调用则使用BackgroundWorker来完成,具体的代码如下: WaitDialog.cs us

Qt下libusb-win32的使用方法(转)

源:Qt下libusb-win32的使用方法 之前一直找不到适合WIN7下的Tiny6410的USB下载软件,正好这几天开始学习USB,所以打算自己写一个专门用于Tiny6410的WIN7下的USB下载软件. 发现了libusb这个库可以用作无驱USB开发,就是说根本不需要了解Window驱动开发的知识就可以开发USB设备驱动,只需要了解一下USB的相关协议即可.Windows下我几乎不用VS来写程序,或者说我不懂MFC吧,呵呵,所示我用Qt来做界面.好了,进入正题. 首先下载libusb-wi

对Qt下对话服务器客户端的总结(MyTcpServer与MyTcpClient)

Qt编写聊天服务器与客户端主要用到下面两个类: QTcpSocket --- 处理连接的 QTcpServer --- 处理服务器,对接入进行响应,创建每个链接的QTcpSocket实例 编写网络程序需要在 .pro 文件中加上 network,如下 QT += core gui network 1.客户端的编写 客户端需要做的事: 获取服务器的主机ip和端口(port) 链接主机(connectToHost) 链接状态下等待一些信号(signal)的产生并作出相应的回应(slot) 主要等待的

cocos2d-x3.x 弹出对话框的设计与实现

先定义一个类PopupLayer 代码PopupLayer.h #ifndef __crossDT_PopupLayer__ #define __crossDT_PopupLayer__ #include "cocos2d.h" #include "cocos-ext.h" USING_NS_CC; using namespace cocos2d::extension; class PopupLayer :public Layer { public: PopupLa

围观迅为IMX6开发板QT下LVDS和HDMI如何双屏异显的

首先将迅为-IMX6开发板分别连接9.7寸屏和HDMI显示器 然后使用MfgTool工具烧写QT系统 然后拨码开关设置成从emmc启动 在uboot命令行下设置开发板为9.7寸屏显示(这样也会同时设置HDMI) 设置完,保存配置,如下图: 然后设置启动QT系统,并保存设置,如下图: 然后开发板重新启动,可以看到默认9.7寸屏显示qt的触摸校准程序了,点击屏幕校准,最后会在9.7寸屏上运行QT的demo程序.HDMI显示通道默认是关闭的,在串口命令行下输入命令"echo 0 > /sys/c

QT学习 之 对话框 (四) 字体对话框、消息对话框、文件对话框、进程对话框(超详细中文注释)

QMessageBox类: 含有Question消息框.Information消息框.Warning消息框和Critical消息框等 通常有两种方式可以来创建标准消息对话框: 一种是采用“基于属性”的API,一种是使用QMessageBox的静态方法. 后者书写容易,但缺少灵活性,针对用户给出的提示的信息不够丰富,并且不能自定义消息对话框里面的按钮提示信息.因此推荐第一种写法. [cpp] view plaincopy <span style="font-size:18px;"&

delphi中formatFloat代码初探(在qt下实现floatformat的函数)

由于项目需要,需要在qt下实现floatformat的函数.之前写过一个,但是写得不好.决定重新写一个,参考delphi xe2下的实现.把xe2下的相关代码都看了一遍,xe2的代码思路在这里贴出来.xe2下的代码在system.sysutils下,核心函数是InternalFloatToTextFmt.它有汇编的版本跟纯pascal的版本.汇编看不懂,参考的是纯pascal的版本. 整体流程是: 1)解析format格式化字符串 [delphi] view plain copy Result