当前位置: 首页 > news >正文

Qt:关闭对话框,动画实现窗体逐渐缩小到消失

关键技术:

1、使用QPropertyAnimation对象,实现动画效果,逐渐缩小窗体尺寸,以及透明度;

2、在对话框缩小时,要将界面中的控件都隐藏起来,并且将对话框布局的Margin修改成0

代码如下:

dialog.h

#ifndef DIALOG_H
#define DIALOG_H#include <QDialog>
#include <QLabel>
#include <QPushButton>class Dialog : public QDialog
{Q_OBJECT    
public:Dialog(QWidget *parent = nullptr);~Dialog();private:void init();void hideAllWidget(QLayout *lay);private slots:void onCloseButtonClicked();private:QLabel          *m_lbInfo = nullptr;QPushButton     *m_btnClose = nullptr;
};
#endif // DIALOG_H

dialog.cpp

#include "dialog.h"
#include <QVBoxLayout>
#include <QPropertyAnimation>
#include <QParallelAnimationGroup>Dialog::Dialog(QWidget *parent): QDialog(parent)
{init();
}Dialog::~Dialog()
{
}void Dialog::init()
{this->setMaximumSize(500, 400);//  去掉标题栏this->setWindowFlags(Qt::FramelessWindowHint);m_lbInfo = new QLabel(this);m_btnClose = new QPushButton("关闭", this);m_lbInfo->setWordWrap(true);m_lbInfo->setText("秦时明月汉时关,\n万里长征人未还。\n但使龙城飞将在,\n不教胡马度阴山。");m_btnClose->setFixedSize(100, 32);QVBoxLayout *vLay = new QVBoxLayout(this);vLay->setMargin(50);vLay->setSpacing(60);vLay->addWidget(m_lbInfo, 0, Qt::AlignCenter);vLay->addWidget(m_btnClose, 0, Qt::AlignRight);connect(m_btnClose, &QPushButton::clicked, this, &Dialog::onCloseButtonClicked);
}void Dialog::hideAllWidget(QLayout *lay)
{if (!lay)return;lay->setMargin(0);for (int i = 0; i < lay->count(); ++i) {QLayout *subLay = lay->itemAt(i)->layout();if (subLay) {hideAllWidget(subLay);}QWidget *wgt = lay->itemAt(i)->widget();if (wgt) {wgt->hide();}}
}void Dialog::onCloseButtonClicked()
{// 隐藏所有的组件,因为这些组件若显示的话,就会占据一定的位置,对话框就不能缩小到0hideAllWidget(this->layout());const QRect &currRect = this->geometry();// 实现对话框逐渐缩小的动画QPropertyAnimation *pAnim1 = new QPropertyAnimation(this, "geometry");pAnim1->setStartValue(currRect);pAnim1->setEndValue(QRect(currRect.x(), currRect.y(), 0, 0));pAnim1->setEasingCurve(QEasingCurve::Linear);pAnim1->setDuration(600);// 实现对话框逐渐隐退的动画QPropertyAnimation *pAnim2 = new QPropertyAnimation(this, "windowOpacity");pAnim2->setStartValue(1);pAnim2->setEndValue(0.5);pAnim2->setDuration(600);QParallelAnimationGroup *animGrp = new QParallelAnimationGroup(this);animGrp->addAnimation(pAnim1);animGrp->addAnimation(pAnim2);animGrp->start(QAbstractAnimation::DeleteWhenStopped);connect(animGrp, &QParallelAnimationGroup::finished, this, &Dialog::close);
}

效果图如下:

http://www.lryc.cn/news/212148.html

相关文章:

  • 在Windows上 ciphey安装(详细版)
  • 【lesson2】数据库的库操作
  • Android Studio Giraffe解决gradle reload failed问题
  • 刷题笔记day06-哈希表
  • springboot项目中如何实现过滤器鉴权
  • 【rust/esp32】在idf中使用embedded-graphics控制st7789 LCD屏幕
  • YOLOv8如何添加注意力模块?
  • 用LibreOffice在excel中画折线图
  • RabbitMQ 链接管理-发布者-消费者
  • JAVA中的垃圾回收器(3)----ZGC
  • IDEA 如何运行 SpringBoot 项目
  • Linux MeterSphere测试平台远程访问你不会?来试试这篇文章
  • 15.k8s集群防火墙配置
  • Python beautifulsoup网络抓取和解析cnblog首页帖子数据
  • Java集成腾讯云OCR身份证识别接口
  • C++之C++11引入enum class与传统enum关键字总结(二百五十一)
  • 如何将word格式的文档转换成markdown格式的文档
  • Leetcode—2558.从数量最多的堆取走礼物【简单】
  • 【如何写论文】硕博学位论文的结构框架、过程与大纲分析
  • 砷化镓(GaAs)纳米线 砷化镓纳米线 GaAs纳米线 瑞禧
  • PostGreSQL:JSON|JSONB数据类型
  • 树----数据结构
  • GitLab定时备份
  • SQL IN 运算符
  • 虚拟机构建单体项目及前后端分离项目
  • 代码浅析DLIO(一)---整体框架梳理
  • Springboot的Container Images,docker加springboot
  • c 从avi 视频中提取图片
  • Jtti:Apache服务的反向代理及负载均衡怎么配置
  • 82.二分查找