Qt实现思维导图功能5『纵向分布模式』

前文链接:Qt实现思维导图功能4『撤销回撤机制』
思维导图纵向分布模式:模式一

百度网盘体验地址:
链接:https://pan.baidu.com/s/1YNSBiFOUwnSSKvHsBvOT3g 
提取码:ifyc

动态演示效果


静态展示图片
在这里插入图片描述

前文BUG维护

序号问题
1修复侧滑菜单栏首次收缩卡顿问题
2修复侧滑功能窗口未能置顶问题
3修复侧滑功能窗口状态未与思维导图状态统一问题
4优化侧滑功能窗口图片,由svg格式文件转换
5升级侧滑功能窗口,增加功能标题和功能备注,增加鼠标进出动态效果

新增功能如下

序号简述具体功能
1布局转换思维导图横向模式与纵向模式间任意切换

新升级的侧滑窗口鼠标进出动效代码

#pragma once

/*
 * 思维导图-侧滑窗体-阴影图画按钮
 * 按钮文本:标题|说明(文本用“|”分割)
 */

#include <QSvgWidget>
#include <QPaintEvent>
#include <QMouseEvent>

class QPropertyAnimation;

class ShadowButton : public QSvgWidget
{
	Q_OBJECT
	Q_PROPERTY(int offsetY READ offsetY WRITE setOffsetY)

public:
	enum IMAGE_TYPE
	{
		IT_PIXMAP,	// 常规图片
		IT_SVG		// SVG格式文件
	};

	ShadowButton(QWidget *parent = nullptr);
	~ShadowButton();

	// 设置文本
	void setText(const QString &text);
	// 设置选中状态
	void setChecked(bool checked);
	// 设置图片
	void setPixmap(const QPixmap &pixmap);
	// 设置SVG文件名
	void setSvgFileName(const QString &svgFileName);

protected:
	void mouseReleaseEvent(QMouseEvent *event);
	void paintEvent(QPaintEvent *event);
	void enterEvent(QEvent *event);
	void leaveEvent(QEvent *event);
	virtual QSize sizeHint() const;

private:
	void setOffsetY(int offsetY);
	int offsetY();

signals:
	void clicked();

private:
	IMAGE_TYPE m_type;		// 图片类型
	QString m_text;			// 文本
	bool m_checked;			// 选中
	qreal m_opacity;		// 透明度
	QColor m_coverColor;	// 遮罩颜色
	QPixmap m_pixmap;		// 图片
	int m_coverHieght;		// 遮罩高度
	int m_offsetY;			// 遮罩偏移
	QPropertyAnimation *m_animation;
};


#include "ShadowButton.h"
#include <QPainter>
#include <QPropertyAnimation>

ShadowButton::ShadowButton(QWidget *parent /*= nullptr*/)
	: QSvgWidget(parent)
{
	m_type = IT_PIXMAP;
	m_opacity = 0.75;
	m_coverColor = QColor(0, 0, 0);
	m_coverHieght = 100;
	m_offsetY = m_coverHieght / 2;

	m_animation = new QPropertyAnimation(this, "offsetY", this);
	m_animation->setEasingCurve(QEasingCurve::Linear);
	m_animation->setDuration(300);
}

ShadowButton::~ShadowButton()
{

}

void ShadowButton::setText(const QString &text)
{
	if (m_text != text)
	{
		m_text = text;
		update();
	}
}

void ShadowButton::setChecked(bool checked)
{
	if (m_checked != checked)
	{
		m_checked = checked;
		update();
	}
}

void ShadowButton::setPixmap(const QPixmap &pixmap)
{
	m_pixmap = pixmap;
	m_type = IT_PIXMAP;
	update();
}

void ShadowButton::setSvgFileName(const QString &svgFileName)
{
	load(svgFileName);
	m_type = IT_SVG;
	update();
}

void ShadowButton::mouseReleaseEvent(QMouseEvent *event)
{
	Q_UNUSED(event)

	emit clicked();
}

void ShadowButton::paintEvent(QPaintEvent *event)
{
	Q_UNUSED(event)

	QPainter painter(this);
	painter.setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing);

	// 设置剪切路径
	QPainterPath path;
	int radius = 10;
	path.addRoundedRect(rect(), radius, radius);
	painter.setClipPath(path);

	// 绘制图片
	if (m_type == IT_PIXMAP)
		painter.drawPixmap(rect(), m_pixmap);
	else// m_type == IT_SVG
		QSvgWidget::paintEvent(event);

	// 绘制遮罩
	painter.setPen(Qt::NoPen);
	painter.setBrush(m_coverColor);
	painter.setOpacity(m_opacity);
	QPainterPath coverPath1;
	coverPath1.addRect(rect());
	QPainterPath coverPath2;
	coverPath2.addRect(rect().adjusted(0, height() - m_offsetY, 0, 0));
	QPainterPath coverPath = coverPath1.intersected(coverPath2);
	painter.drawPath(coverPath);

	// 绘制标题
	painter.setPen(Qt::white);
	QStringList texts = m_text.split("|");
	if (2 == texts.size())
		painter.drawText(QRect(0, height() - m_offsetY + m_coverHieght / 2, width(), m_coverHieght / 2), Qt::AlignCenter, texts.at(1));
	if (1 <= texts.size())
	{
		if (m_checked)
			painter.setPen(QPen(QColor(119, 169, 253)));

		QFont font = painter.font();
		font.setPixelSize(20);
		painter.setFont(font);
		painter.drawText(QRect(0, height() - m_offsetY, width(), m_coverHieght / 2), Qt::AlignCenter, texts.at(0));
	}
}

void ShadowButton::enterEvent(QEvent *event)
{
	Q_UNUSED(event)

	if (m_animation->state() != QAbstractAnimation::Stopped)
		m_animation->stop();
	m_animation->setStartValue(m_offsetY);
	m_animation->setEndValue(m_coverHieght);
	m_animation->start();
	update();
}

void ShadowButton::leaveEvent(QEvent *event)
{
	Q_UNUSED(event)

	if (m_animation->state() != QAbstractAnimation::Stopped)
		m_animation->stop();
	m_animation->setStartValue(m_offsetY);
	m_animation->setEndValue(m_coverHieght / 2);
	m_animation->start();
	update();
}

QSize ShadowButton::sizeHint() const
{
	int w = width();
	return(QSize(w, w));
}

void ShadowButton::setOffsetY(int offsetY)
{
	m_offsetY = offsetY;
	update();
}

int ShadowButton::offsetY()
{
	return m_offsetY;
}

QT思维导图开发库是一种基于QT平台的软件开发工具,用于快速构建和定制思维导图功能的应用程序。通过使用这个开发库,开发者可以轻松地在其应用程序中添加思维导图功能,使用户可以创建、编辑和操作思维导图QT思维导图开发库提供了丰富的API和类,使开发者能够灵活地定制思维导图的外观和行为。开发者可以自定义节点的样式、颜色、字体等外观特性,也可以定义节点之间的连接方式和布局方式。此外,开发者还可以通过调用相应的API来使用户能够通过拖拽、缩放、移动等方式对思维导图进行操作。 QT思维导图开发库还提供了丰富的事件处理机制,使开发者能够方便地响应用户的操作。通过监听节点的点击、拖拽、改变大小等事件,开发者可以根据需求执行相应的逻辑操作,比如打开、删除、复制节点等。 除了基本的思维导图功能QT思维导图开发库还支持一些高级特性,如搜索、过滤、导出等。开发者可以通过调用相应的API来实现这些功能,使用户能够更方便地浏览和管理思维导图。 总之,QT思维导图开发库是一个功能强大、易于使用的工具,适用于需要在自己的应用程序中添加思维导图功能开发者。它提供了丰富的功能和灵活的定制选项,使开发者能够轻松地打造出符合自己需求的思维导图应用程序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

浮生卍流年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值