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);
}
相关推荐
weixin_445476681 小时前
Java并发编程——synchronized的实现原理与应用
java·开发语言·并发·synchronized
yi碗汤园1 小时前
【超详细】C#自定义工具类-StringHelper
开发语言·前端·unity·c#·游戏引擎
sali-tec1 小时前
C# 基于halcon的视觉工作流-章49-网面破损
开发语言·图像处理·算法·计算机视觉·c#
YuanlongWang1 小时前
c# ABP vNext 框架详解及其模块化开发思想介绍
开发语言·c#
张人玉2 小时前
WPF布局控件(界面骨架核心)
开发语言·c#·wpf·布局控件
闲人编程2 小时前
使用MLflow跟踪和管理你的机器学习实验
开发语言·人工智能·python·机器学习·ml·codecapsule
看兵马俑的程序员2 小时前
RAG实现-本地PDF内容加载和切片
开发语言·python·pdf
专注前端30年2 小时前
【JavaScript】reduce 方法的详解与实战
开发语言·前端·javascript
两个人的幸福online2 小时前
php使用腾讯云服务
开发语言·php·腾讯云
无敌最俊朗@2 小时前
C++ STL Deque 高频面试题与答案
开发语言·c++