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);
}
相关推荐
测试员周周2 小时前
【Appium 系列】第16节-WebView-H5上下文切换 — 混合应用的自动化难点
运维·开发语言·人工智能·功能测试·appium·自动化·测试用例
杜子不疼.4 小时前
【C++ AI 大模型接入 SDK】 - DeepSeek 模型接入(上)
开发语言·c++·chatgpt
加号34 小时前
【C#】 串口通信技术深度解析及实现
开发语言·c#
sycmancia5 小时前
Qt——编辑交互功能的实现
开发语言·qt
石山代码5 小时前
C++ 内存分区 堆区
java·开发语言·c++
无风听海6 小时前
C# 隐式转换深度解析
java·开发语言·c#
一只大袋鼠6 小时前
Git 进阶(二):分支管理、暂存栈、远程仓库与多人协作
java·开发语言·git
LuminousCPP7 小时前
数据结构 - 线性表第四篇:C 语言通讯录优化升级全记录(踩坑 + 思考)
c语言·开发语言·数据结构·经验分享·笔记·学习
web3.08889997 小时前
1688 图搜接口(item_search_img / 拍立淘) 接入方法
开发语言·python
один but you8 小时前
从可变参数到 emplace:现代 C++ 性能优化的核心组合
java·开发语言