Qt自定义MessageToast

效果:

文字长度自适应,自动居中到parent,会透明渐变消失。

cpp 复制代码
CustomToast::MessageToast(QS("最多添加50张图片"),this);

1. CustomToast.h

cpp 复制代码
#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

cpp 复制代码
#include "CustomToast.h"

#include <QGraphicsOpacityEffect>
#include <QHBoxLayout>
#include <QLabel>
#include <QPropertyAnimation>
#include <QTimer>

#define STR(arg) #arg

class 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. 样式表:

css 复制代码
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);
}
相关推荐
小灰灰搞电子10 分钟前
Rust 动态分发(dyn Trait)详解
开发语言·后端·rust
第二只羽毛15 分钟前
C++ 高性能编程要点
大数据·开发语言·c++·算法
老华带你飞26 分钟前
旅游|基于Java旅游信息系统(源码+数据库+文档)
java·开发语言·数据库·vue.js·spring boot·旅游
爱学习的梵高先生1 小时前
C++:基础知识
开发语言·c++·算法
oioihoii1 小时前
C++对象生命周期与析构顺序深度解析
java·开发语言·c++
IMPYLH1 小时前
Lua 的 tonumber 函数
开发语言·笔记·后端·junit·游戏引擎·lua
It's now1 小时前
BeanRegistrar 的企业级应用场景及最佳实践
java·开发语言·spring
毕设源码-赖学姐2 小时前
【开题答辩全过程】以 基于Java的小区物业管理系统APP的设计与实现为例,包含答辩的问题和答案
java·开发语言
繁华似锦respect2 小时前
C++ & Linux 中 GDB 调试与内存泄漏检测详解
linux·c语言·开发语言·c++·windows·算法
锡兰_CC2 小时前
无缝触达,卓越体验:开启openEuler世界的任意门
服务器·网络·数据库·c++·图像处理·qt·nginx