Qt学习教程之对话框消失动画效果

  • 时间:
  • 520人关注

这篇文章主要给大家介绍了关于Qt学习教程之对话框消失动画效果的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧,另外这篇文章主要知识点是关于qt、对话框动画效果、qt、对话框、qt、自定义对话框、Qt学习的内容,如果大家想对相关知识点有系统深入的学习,可以参阅以下电子资料:

教程详情电子资料
  • 教程类别:Qt学习
  • 编辑整理:文梦桐
  • 教程字数:4181字节
  • 阅读时间:大概10分钟
  • 下载本教程(DOC版)
  • Qt Quick核心编程
  • Qt5开发及实例
  • Qt样式表使用大全
  • Qt Creator快速入门
  • Python Qt GUI快速编程:PyQt编程指南
  • 一、效果展示

    最近做了一个提示框消失的功能,觉着挺有意思,以前一直以为Qt子窗口不能做淡出效果,其实Qt的淡出功能已经帮我们封装好了,我们仅仅只需要几行代码就可以做出酷炫的窗口关闭效果,写此篇文章的时候,我特意浏览了下之前写的两篇文章(QPainterPath 不规则提示框,QPainterPath 不规则提示框(二)),现在回想起来那会儿确实知之甚少,关于顶层窗口不能做圆角,其实帮助文档里已经说的很明确,解决办法有多种,一种是重写paintEvent函数,另一种是把widget包装一层,本篇文章就用的是后一种方式,如图1所示窗口关闭动画,实例程序中做了淡出、飞出、缩小等关闭窗口动画,除此之外还包含了阴影、背景着色、滤镜等特效。

    图1 窗口特效

    二、功能

    如图1窗口特效所示,实例中总共包含了4个groupbox,这4个groupbox是分别用来展示不同特效,下面分别讲述4个groupbox

    • 背景色:主要针对窗口背景色进行了定制,就像groupbox中按钮文字那样,是红色和绿色的背景提示框,其中红色提示框使用了最小化关闭效果,绿色提示框使用了淡出特效
    • 飞出:这4个按钮弹出的对话框都使用了飞出特效,4个按钮分别展示了4种飞出的方式(左、上、右、下)
    • 自定义:支持自定义提示框别景色、提示框展示时长、消失动画时长和消失模式
    • shortcut:主要是针对业务进行的功能定制,warning提示框体的图标是进行单独处理的,是一个叹号图标

    三、代码实现

    在讲解代码之前,先来认识几个概念

    • QPropertyAnimation:属性动画,可以参考qt 窗口动画
    • QGraphicsOpacityEffect:窗口透明度设置类,继承自QGraphicsEffect
    • QGraphicsDropShadowEffect:窗口阴影,继承自QGraphicsEffect
    • QGraphicsBlurEffect:滤镜,继承自QGraphicsEffect
    • QGraphicsColorizeEffect:着色,继承自QGraphicsEffect

    1、移出动画,使用属性动画QPropertyAnimation类进行,propertyname的参数是窗口的属性,详情参见Q_PROPERTY属性 。targetObject对象设置为this内部单独封装的widget,这样做的目的使得该提示框不需要依赖其他窗口遮挡即可做出飞出效果

    void GMPOperateTip::MoveOut()
    {
     m_pAnimation->setTargetObject(m_pMoveWidget);
     m_pAnimation->setPropertyName("pos");
    
     m_pAnimation->setStartValue(QPoint());
     switch (m_eDirection)
     {
     case D_LEFT:
      m_pAnimation->setEndValue(QPoint(-width(), 0));
      break;
     case D_TOP:
      m_pAnimation->setEndValue(QPoint(0, -height()));
      break;
     case D_RIGHT:
      m_pAnimation->setEndValue(QPoint(width(), 0));
      break;
     case D_BOTTOM:
      m_pAnimation->setEndValue(QPoint(0, height()));
      break;
     default:
      ;
     }
    }

    2、淡出

    m_pOpacity = new QGraphicsOpacityEffect(this);
    m_pOpacity->setOpacity(1);
    
    setGraphicsEffect(m_pOpacity);
    
    m_pAnimation->setTargetObject(m_pOpacity);
    m_pAnimation->setPropertyName("opacity");
    
    m_pAnimation->setStartValue(1);
    m_pAnimation->setEndValue(0);

    3、最小化

    m_pAnimation->setPropertyName("geometry");
    
    QRect startRect = rect();
    startRect.moveTo(pos());
    QRect stopRect = QRect(startRect.center(), QSize(0, 0));
    
    m_pAnimation->setStartValue(startRect);
    m_pAnimation->setEndValue(stopRect);

    4、动画启动机制

    使用定时器控制动画,当指定时间后启动动画,并且在动画完成后关闭窗口

    void InitializeConnect()
    {
     m_pAnimation = new QPropertyAnimation(this);
     m_pAnimation->setTargetObject(this);
    
     connect(m_pAnimation, &QPropertyAnimation::finished, this, &GMPOperateTip::close);
    
     connect(&m_StayTimer, &QTimer::timeout, this, [this]{
      m_pAnimation->setDuration(m_DurationTime);
      switch (m_eMode)
      {
      case AM_FADEOUT:
       FadeOut_p();
       break;
      case AM_FLYOUT:
       MoveOut();
       break;
      case AM_ZOOMIN:
       ZoomIn();
       break;
      default:
       ;
      }
    
      m_pAnimation->start();
     });
    }

    窗口显示时启动定时器,并且将窗口随机移动到屏幕一个位置

    bool event(QEvent * e)
    {
     if (e->type() == QEvent::Show)
     {
      //QPoint pos = parentWidget()->rect().center() - this->rect().center();
      int wrand = qrand() % (parentWidget()->rect().width() - this->rect().width());
      int hrand = qrand() % (parentWidget()->rect().height() - this->rect().width());
      move(QPoint(wrand, hrand));
    
      m_StayTimer.start(m_iStayDuration);
     }
    
     return __super::event(e);
    }

    5、阴影

    void setShadowEnable(bool enable)
    {
     if (!m_pShadow)
     {
      m_pShadow = new QGraphicsDropShadowEffect(this);
      m_pShadow->setColor(QColor(0, 0, 0, 85));
      m_pShadow->setBlurRadius(10);
      m_pShadow->setOffset(4, 4);
     }
    
     setGraphicsEffect(enable ? m_pShadow : nullptr);
    }

    6、着色

    注释中的代码也可以进行着色,但是窗体的一些特殊样式不能完成,因此使用stylesheet来完成背景色修改

     static const QString c_szStyleSheet = "QWidget{background-color:%1;\
              border:1px solid %2;border-top:0;border-bottom-left-radius:3px;\
              border-bottom-right-radius:3px;background-image: url();}";
    void GMPOperateTip::setBackgroundColor(const QColor & color)
    {
     //if (!m_pColorize)
     //{
     // m_pColorize = new QGraphicsColorizeEffect(this);
     // m_pColorize->setStrength(1);
     // 
     // setGraphicsEffect(m_pColorize);
     //}
     //m_pColorize->setColor(color);
    
     QColor border = color;
     border.setAlpha(255 * 0.1);
     QString borderRgba = QString("rgba(%1,%2,%3,%4)").arg(border.red()).arg(border.green()).arg(border.blue()).arg(border.alpha());
     setStyleSheet(c_szStyleSheet.arg(color.name()).arg(borderRgba));
    }

     7、快捷调用接口,该接口都是类的静态方法可以直接调用

    8、测试,由于测试代码较多,我只贴出2个

    void tip::on_pushButton_success_clicked()
    {
     GMPOperateTip::Success(this, QStringLiteral("测a试º?,ê?测a试º?"), 1000, 1000);
    }
    
    void tip::on_pushButton_warning_clicked()
    {
     GMPOperateTip::Waring(this, QStringLiteral("测a试º?,ê?测a试º?"), 1000, 1000);
    }

    四、demo程序

    动画提示框

    总结

    以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对码农之家的支持。

    码农之家
    pyqt弹出新对话框,以及关闭对话框获取数据的实例

    11小时26分钟前回答

    pyqt弹出新对话框,以及关闭对话框获取数据的实例

    如下所示:

    from PyQt4 import QtGui,QtCore
    import sys
    class Web_Browser(QtGui.QDialog):
      def __init__(self,parent=None):
        QtGui.QWidget.__init__(self)
        self.resize(550,400)
        open=QtGui.QPushButton('OPEN')
        self.connect(open,QtCore.SIGNAL('clicked()'),self.ok)
        grid=QtGui.QGridLayout()
        grid.addWidget(open,1,0,1,1)
        self.setLayout(grid)
        self.setWindowTitle('main windows')  
      def ok(self):
        web=Web_Browser()
        web.setModal(False)
        web.setWindowTitle('sub window')
        web.exec_()
     
    app=QtGui.QApplication(sys.argv)
     
    app.setFont(QtGui.QFont("Helvetica", 16))
    main=Web_Browser()
    main.show()
     
    sys.exit(app.exec_())
    

    以上这篇pyqt弹出新对话框,以及关闭对话框获取数据的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持码农之家。

    展开阅读

    上一篇:c++读取数据文件到数组的实例

    下一篇:ShellExecute函数怎么使用

    相关内容

    • 基于PyQt4和PySide的输入对话框

      这篇文章主要为大家详细介绍了基于PyQt4和PySide实现输入对话框效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

      02-12基于PyQt4和PySide实现输入对话框效果

      阅读更多
    • Qt 5.9 C++开发指南

      Qt 5.9 C++开发指南

      本书以Qt 5.9 LTS版本为开发平台,详细介绍了Qt C 开发应用程序的技术,包括Qt应用程序的基本架构、信号与槽工作机制、图形显示的Graphics/View架构、数据编辑和显示的Model/View架构、对话框和多

      大小:276.3 MBQt开发

      点击下载
    • Qt 5.10 GUI完全参考手册

      Qt 5.10 GUI完全参考手册

      Qt 5.10 GUI完全参考手册 需具有 C++语言基础,适合希望使用 Qt C++开发跨平台应用程序的读者阅读。对 QWidget 的各个子类及其相关的框架结构作了详细的介绍,主要包括,元对象系统,信号和槽,Qt 事件,Qt 主窗口,布局管理及焦点系统,对话框,模型/视图框架,拖放和剪贴板,Qt 文本系统,Qt 界面外观,Qt 2D 绘图和Qt 的输入输出。 本手册是一本讲解 Qt 原理性的教程,对 Qt 的各种原理讲解透彻、深入、细致。书中的示例都是完整的实例程序。 本手册章节

      大小:9.51 MBQt5开发

      点击下载
    • Qt学习之路

      Qt学习之路

      我们所使用的 Qt,确切地说也就是它的 GUI 编程部分。C++的 GUI 编程同 Java 不同:GUI并不是 C++标准的一部分。所以,如果使用 Java,那么你最好的选择就是 AWT/Swing,或者也可以使 SWT/JFace,但是,C++的 GUI 编程给了你更多的选择:wxWidget, gtk++以及 Qt。 在本系列文章中,我们将使用 Qt4 进行 C++ GUI 的开发。我是参照着《C++ GUI Programming with Qt4》一书进行学习的。其实,我也只是初学 Qt4,在这

      大小:4.01 MBQt开发

      点击下载

    学习笔记

    21小时47分钟前回答

    PyQt5基本控件使用之消息弹出、用户输入、文件对话框的使用方法

    本文主要介绍PyQt界面实现中常用的消息弹出对话框、提供用户输入的输入框、打开文件获取文件/目录路径的文件对话框。学习这三种控件前,先想一下它们使用的主要场景: 1、消息弹出对话框。程序遇到问题需要退出需要弹出错误提示框 、程序执行可能造成的风险需要弹出警告窗口提示用户是否进一步执行等等。 2、用户输入框。比如常见的让用户选择执行的程序分支、yes/no等等。 3、文件对话框。获取本地文件或者文件夹的完整路径甚至是直接打开文件显示文件内容。 本文主要针对这三种控件的主要场景进行介绍。 QMessageBox:弹出对话框控件 QMessageBox是一种通用的弹出式对话框,用于显示消息,……

    48小时41分钟前回答

    对PyQt5的输入对话框使用(QInputDialog)详解

    PyQt5中QInputDialog的使用,Qt的QInputDialog类提供了一种简单方面的对话框来获得用户的单个输入信息,它提供了4种数据类型的输入: 1)字符串型(方法=QInputDialog.getText); 2)Int类型数据(方法=QInputDialog.getInt); 3)double类型数据(方法=QInputDialog.getDouble); 4)下拉列表框的条目(方法=QInputDialog.getItem)。 QInputDialog继承自QDialog,提供简单输入的对话框: class QInputDialog(QDialog) | QInputDialog(QWidget parent=None, Qt.WindowFlags flags=0) QInputDialog简介: Qt提供了一个QInputDialog类,QInputDialogDialog类提供了一种简单方便的对话框来获得用户的单个输入信息,目前提供了4种数据类型的输入,可以使一个字符串、一个Int类型数……