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

Qt自定义MessageToast

效果:

文字长度自适应,自动居中到parent,会透明渐变消失。
在这里插入图片描述

CustomToast::MessageToast(QS("最多添加50张图片"),this);

1. CustomToast.h

#pragma once#include <QFrame>class CustomToast : public QFrame {Q_OBJECT
public:static void MessageToast(const QString &text, QWidget *parent = nullptr, int timeout = 1500);private:CustomToast(QWidget *parent = nullptr, int timeout = 1500);void setText(const QString &text);
private:class Impl;std::shared_ptr<Impl> m_impl = nullptr;class Ui;std::shared_ptr<Ui> ui = nullptr;
};

2. CustomToast.cpp

#include "CustomToast.h"#include <QGraphicsOpacityEffect>
#include <QHBoxLayout>
#include <QLabel>
#include <QPropertyAnimation>
#include <QTimer>#define STR(arg) #argclass CustomToast::Ui {public:void setupUi(QWidget *parent){layout = new QHBoxLayout(parent);parent->setLayout(layout);parent->setContentsMargins(0, 0, 0, 0);layout->setContentsMargins(0, 0, 0, 0);layout->setContentsMargins(16, 8, 16, 8);labelIcon = new QLabel(parent);labelText = new QLabel(parent);auto iconLayout = new QHBoxLayout(parent);iconLayout->addWidget(labelIcon);iconLayout->setContentsMargins(0, 2, 0, 2);layout->addLayout(iconLayout);layout->addWidget(labelText);layout->setSpacing(3);labelIcon->setFixedSize(16, 16);labelText->setMinimumHeight(20);labelText->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed);parent->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed);parent->setObjectName(STR(CustomToast));labelIcon->setObjectName(STR(labelIcon));labelText->setObjectName(STR(labelText));}QHBoxLayout *layout = nullptr;QLabel *labelIcon	= nullptr;QLabel *labelText	= nullptr;
};class CustomToast::Impl {
public:Impl(CustomToast *parent, int timeout) : m_parent(parent), m_timeout(timeout){}void startOpacityAnimation(){auto graphicsOpacityEffect = new QGraphicsOpacityEffect(m_parent);graphicsOpacityEffect->setOpacity(1.0);m_parent->setGraphicsEffect(graphicsOpacityEffect);auto opacityAnimation = new QPropertyAnimation(graphicsOpacityEffect, "opacity");opacityAnimation->setDuration(m_timeout);opacityAnimation->setStartValue(1.0);opacityAnimation->setEndValue(0);opacityAnimation->setEasingCurve(QEasingCurve::InCubic);opacityAnimation->start();}void centerToParent(){auto grandParent = m_parent->parentWidget();if (grandParent) {m_parent->move(grandParent->width() / 2 - m_parent->width() / 2, grandParent->height() / 2 - m_parent->height() / 2);}}void deleteLater(){QTimer::singleShot(m_timeout, m_parent, [=] { m_parent->deleteLater(); });}private:QWidget *m_parent = nullptr;int m_timeout	  = 1500;
};void
CustomToast::MessageToast(const QString &text, QWidget *parent /*= nullptr*/, int timeout /*= 1500*/)
{auto toast = new CustomToast(parent, timeout);toast->setText(text);toast->show();m_impl->centerToParent();
}CustomToast::CustomToast(QWidget *parent, int timeout) :QFrame(parent), ui(std::make_shared<Ui>()), m_impl(std::make_shared<Impl>(this, timeout))
{ui->setupUi(this);m_impl->centerToParent();m_impl->startOpacityAnimation();m_impl->deleteLater();
}void
CustomToast::setText(const QString &text)
{ui->labelText->setText(text);adjustSize();
}

3. 样式表:

CustomToast{background: rgba(0, 0, 0, 0.8);border-radius: 4px;
}
CustomToast #labelText{color: #FFFFFF;font-family: Microsoft YaHei;font-size: 14px;font-weight: 400;
}
CustomToast #labelIcon{border-image: url(:/img/toast/info.png);
}
http://www.lryc.cn/news/407510.html

相关文章:

  • 自动化测试 pytest 中 scope 限制 fixture使用范围!
  • 软件-vscode-plantUML-drawio
  • Python爬虫实战案例(爬取图片)
  • 智慧工地视频汇聚管理平台:打造现代化工程管理的全新视界
  • ASP.NET中的六大对象有哪些?以及各自的功能以及使用方式
  • Elastic 及阿里云 AI 搜索 Tech Day 将于 7 月 27 日在上海举办
  • 基于ssm+vue医院住院管理系统源码数据库
  • 【在排序数组中查找元素的第一个和最后一个位置】python刷题记录
  • Pytorch基础:Tensor的squeeze和unsqueeze方法
  • PHP压缩打包,下载目录或者文件,解压zip文件
  • 后端面试题日常练-day08 【Java基础】
  • Linux:core文件无法生成排查步骤
  • 大模型学习资源
  • 约定(模拟赛2 T3)
  • Java推送xml数据进行http请求
  • Docker安装 OpenResty详细教程
  • 前端位运算运用场景小知识(权限相关)
  • 【云原生】Kubernetes中的DaemonSet介绍、原理、用法及实战应用案例分析
  • 使用框架构建React Native应用程序的最佳实践
  • Godot入门 02玩家1.0版
  • Docker-Compose配置zookeeper+KaFka+CMAK简单集群
  • Python中,集合几种基本运算
  • netsuite查询货品库存
  • Java 实现分页的几种方式详解
  • vite构建vue3项目hmr生效问题踩坑记录
  • 区块链赋能民生大数据
  • 10 Vue 特性要点
  • ESP32和mDNS学习
  • 学习SQL如何使用CASE语句查询分析设备状态
  • Gartner发布2024年零信任网络技术成熟度曲线:20项零信任相关的前沿和趋势性技术