Qt实现思维导图功能2『UI设计』

前文链接:Qt实现思维导图功能1『核心树』

百度网盘体验地址:
链接:https://pan.baidu.com/s/1-be0tDJokpZeqhMEuHQntA 
提取码:4d1w
注:UI窗体风格参考软件:爱莫流程图

效果图
1、动态演示效果:
在这里插入图片描述

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

前文BUG维护

序号问题
1维护删除按钮未跟随文本宽度变化的问题
2删除节点可能奔溃:删除节点时,没有从父节点属性中移除与被删除节点的连线
3鼠标未双击进入编辑时,任然可以输入文本的问题
4未过滤鼠标右键双击进入编辑文本状态的问题
5双击文本节点,遇到“-”等分隔符时,未全部选中文本的问题

新增功能如下

序号简述具体功能
1快捷键Tab键新建子节点、Del键删除节点
2节点高亮选中节点时,该节点至根节点路径高亮
3编辑菜单新建、编辑
5调整菜单清空、整理、放大、缩小、折叠
6风格菜单高亮、线型、主题、大纲(待做)
7文件菜单导入(待优化)、保存(待优化)、导出(待做)
8回撤菜单撤销(待做)、回撤(待做)
9节点操作上级、同级、下级、清空、删除、上移、下移

新增UI如下

序号简述具体功能
1简约提示菜单简单的悬浮提示效果,例如:”放大“菜单
2选中提示菜单拥有选中/未选中两种状态,例如:“高亮”菜单
3切换提示菜单拥有两种功能相互切换状态,例如:”折叠/展开“菜单
4侧滑菜单栏窗口位置动态变化,形成左侧滑动效果
5侧滑菜单栏菜单简单的悬浮提示效果
6侧滑菜单栏显隐按钮按钮宽度动态变化,图标动态旋转
7侧滑功能窗口窗口位置动态变化,形成左/右侧边滑动效果
8侧滑功能窗口功能项常态阴影、悬浮态高亮效果

UI提示菜单代码
1、UML类图
在这里插入图片描述
2、代码

ToolTipButtonBase基类,提供信息位置类型设置、提示信息文本和提示信息三态图片设置;
enterEvent事件和leaveEvent事件负责设置提示信息的显隐,paintEvent事件负责绘图。

#pragma once

/*
 * 思维导图-提示按钮基类
 */

#include <QPushButton>

class ToolTipButtonBase : public QPushButton
{
public:
	enum PositionType
	{
		RIGHT,	// 右侧
		BOTTOM,	// 下侧
		LEFT,	// 左侧
		TOP		// 上侧	
	};

	ToolTipButtonBase(QWidget *parent = nullptr);
	virtual ~ToolTipButtonBase();

	// 获取提示信息位置类型
	PositionType positionType();
	// 设置图片
	void setPixmap(const QPixmap &pixmap, const QPixmap &hoverPixmap, const QPixmap &disablePixmap);
	// 设置提示信息文本和位置类型
	void setToolTip(const QString &text, PositionType posType);

protected:
	virtual void paintEvent(QPaintEvent *event) override;
	virtual void enterEvent(QEvent *event) override;
	virtual void leaveEvent(QEvent *event) override;

protected:
	QString m_toolTip;			// 提示信息文本
	PositionType m_posType;		// 提示信息位置
	QPixmap m_pixmap;			// 常态图片
	QPixmap m_hoverPixmap;		// 悬浮态图片
	QPixmap m_disablePixmap;	// 禁用态图片
	QColor m_color;				// 文本颜色
	QColor m_hoverColor;		// 文本悬浮颜色
	QColor m_disableColor;		// 文本禁用颜色
	QColor m_bgColor;			// 背景颜色
	QColor m_bgHoverColor;		// 背景悬浮颜色
	QColor m_bgDisableColor;	// 背景禁用颜色

	bool m_hover;				// 悬浮
	bool m_disable;				// 使能状态
};
#include "ToolTipButtonBase.h"
#include "../ToolTip/FuncToolTip.h"
#include <QPainter>

ToolTipButtonBase::ToolTipButtonBase(QWidget *parent /*= nullptr*/)
	: QPushButton(parent)
{
	m_posType = RIGHT;						// 提示信息位置
	m_color = QColor(51, 51, 51);			// 文本颜色
	m_hoverColor = QColor(57, 130, 252);	// 文本悬浮颜色
	m_disableColor = QColor("#bfbfbf");		// 文本禁用颜色
	m_bgColor = Qt::white;					// 背景颜色
	m_bgHoverColor = QColor(238, 244, 255);	// 背景悬浮颜色
	m_bgDisableColor = Qt::white;			// 背景禁用颜色

	m_hover = false;						// 悬浮
	m_disable = false;						// 使能状态
}

ToolTipButtonBase::~ToolTipButtonBase()
{

}

ToolTipButtonBase::PositionType ToolTipButtonBase::positionType()
{
	return m_posType;
}

void ToolTipButtonBase::setPixmap(const QPixmap &pixmap, const QPixmap &hoverPixmap, const QPixmap &disablePixmap)
{
	m_pixmap = pixmap;
	m_hoverPixmap = hoverPixmap;
	m_disablePixmap = disablePixmap;
	update();
}

void ToolTipButtonBase::setToolTip(const QString &text, PositionType posType)
{
	m_toolTip = text;
	m_posType = posType;
	FuncToolTip::setToolTipVisible(false);	// ①
	FuncToolTip::setToolTipInfo(this, m_toolTip);
	FuncToolTip::setToolTipVisible(true);	// ②
	update();

	// 备注:若不设置①②两行代码,则提示窗口不更新文本。。。
}

void ToolTipButtonBase::paintEvent(QPaintEvent *event)
{
	int width = this->width();
	int height = this->height();

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

	// 绘制背景
	painter.setPen(Qt::NoPen);
	painter.setBrush(!isEnabled() ? m_bgDisableColor : (m_hover ? m_bgHoverColor : m_bgColor));
	painter.drawRect(rect());
	// 绘制图片
	painter.drawPixmap(width * 0.3, height * 0.16, width * 0.4, height * 0.34, !isEnabled() ? m_disablePixmap : (m_hover ? m_hoverPixmap : m_pixmap));
	// 绘制文本
	painter.setPen(QPen(!isEnabled() ? m_disableColor : (m_hover ? m_hoverColor : m_color)));
	painter.drawText(QRect(0, height * 0.62, width, height * 0.26), Qt::AlignCenter, text());
}

void ToolTipButtonBase::enterEvent(QEvent *event)
{
	m_hover = true;
	FuncToolTip::setToolTipInfo(this, m_toolTip);
	FuncToolTip::setToolTipVisible(true);
}

void ToolTipButtonBase::leaveEvent(QEvent *event)
{
	m_hover = false;
	FuncToolTip::setToolTipVisible(false);
}

简约提示菜单

#pragma once

/*
 * 思维导图-菜单功能提示按钮
 */

#include "../FuncWidget/ToolTipButtonBase.h"

class MenuToolTipButton : public ToolTipButtonBase
{
public:
	MenuToolTipButton(QWidget *parent = nullptr);
	~MenuToolTipButton();

	void setPixmap(const QPixmap &pixmap);

protected:
	virtual void paintEvent(QPaintEvent *event) override;
};
#include "MenuToolTipButton.h"
#include <QPainter>

MenuToolTipButton::MenuToolTipButton(QWidget *parent /*= nullptr*/)
	: ToolTipButtonBase(parent)
{
	m_bgHoverColor = QColor(243, 243, 243);
	m_bgDisableColor = Qt::white;
}

MenuToolTipButton::~MenuToolTipButton()
{

}

void MenuToolTipButton::setPixmap(const QPixmap &pixmap)
{
	m_pixmap = pixmap;
	update();
}

void MenuToolTipButton::paintEvent(QPaintEvent *event)
{
	int width = this->width();
	int height = this->height();

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

	// 绘制背景
	painter.setPen(Qt::NoPen);
	painter.setBrush(m_hover ? m_bgHoverColor : m_bgColor);
	painter.drawRect(rect());
	// 绘制图片
	painter.drawPixmap(width * 0.3, height * 0.16, width * 0.4, height * 0.34, m_pixmap);
	// 绘制文本
	painter.setPen(QPen(m_disable ? m_disableColor : m_color));
	painter.drawText(QRect(0, height * 0.62, width, height * 0.26), Qt::AlignCenter, text());
}

选中提示菜单

#pragma once

/*
 * 思维导图-菜单功能提示:状态选中按钮
 */

#include "MenuToolTipButton.h"

class MenuToolTipCheckButton : public MenuToolTipButton
{
public:
	MenuToolTipCheckButton(QWidget *parent = nullptr);
	~MenuToolTipCheckButton();

	void setPixmap(const QPixmap &pixmap, const QPixmap &checkedPixmap);

protected:
	virtual void paintEvent(QPaintEvent *event) override;
};
#include "MenuToolTipCheckButton.h"
#include <QPainter>

MenuToolTipCheckButton::MenuToolTipCheckButton(QWidget *parent /*= nullptr*/)
	: MenuToolTipButton(parent)
{

}

MenuToolTipCheckButton::~MenuToolTipCheckButton()
{

}

void MenuToolTipCheckButton::setPixmap(const QPixmap &pixmap, const QPixmap &checkedPixmap)
{
	m_pixmap = pixmap;
	m_hoverPixmap = checkedPixmap;
	update();
}

void MenuToolTipCheckButton::paintEvent(QPaintEvent *event)
{
	int width = this->width();
	int height = this->height();

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

	// 绘制背景
	painter.setPen(Qt::NoPen);
	painter.setBrush(m_hover ? m_bgHoverColor : m_bgColor);
	painter.drawRect(rect());
	// 绘制图片
	painter.drawPixmap(width * 0.3, height * 0.16, width * 0.4, height * 0.34, isChecked() ? m_hoverPixmap : m_pixmap);
	// 绘制文本
	painter.setPen(QPen(isChecked() ? m_hoverColor : m_color));
	painter.drawText(QRect(0, height * 0.62, width, height * 0.26), Qt::AlignCenter, text());
}

切换提示菜单

#pragma once

/*
 * 思维导图-菜单功能提示:文本切换按钮
 */

#include "MenuToolTipButton.h"

class MenuToolTipChangeButton : public MenuToolTipButton
{
public:
	MenuToolTipChangeButton(QWidget *parent = nullptr);
	~MenuToolTipChangeButton();

	void setButtonText(const QString &text, const QString &changeText);
	void setPixmap(const QPixmap &pixmap, const QPixmap &changePixmap);
	void change();
	bool changed();

protected:
	virtual void paintEvent(QPaintEvent *event) override;

private:
	QString m_text;			// 文本
	QString m_changeText;	// 切换文本
	bool m_change;			// 切换
};
#include "MenuToolTipChangeButton.h"
#include "../ToolTip/FuncToolTip.h"
#include <QPainter>

MenuToolTipChangeButton::MenuToolTipChangeButton(QWidget *parent /*= nullptr*/)
	: MenuToolTipButton(parent)
{
	m_change = false;	// 切换
	connect(this, &QPushButton::clicked, this, [&]() {
		m_change = !m_change;
		setToolTip(m_change ? m_changeText : m_text, m_posType);
		update();
	});
}

MenuToolTipChangeButton::~MenuToolTipChangeButton()
{

}

void MenuToolTipChangeButton::setButtonText(const QString &text, const QString &changeText)
{
	m_text = text;
	m_changeText = changeText;
	update();
}

void MenuToolTipChangeButton::setPixmap(const QPixmap &pixmap, const QPixmap &changePixmap)
{
	m_pixmap = pixmap;
	m_hoverPixmap = changePixmap;
}

void MenuToolTipChangeButton::change()
{
	m_change = !m_change;
	setToolTip(m_change ? m_changeText : m_text, m_posType);
	FuncToolTip::setToolTipVisible(false);
}

bool MenuToolTipChangeButton::changed()
{
	return m_change;
}

void MenuToolTipChangeButton::paintEvent(QPaintEvent *event)
{
	int width = this->width();
	int height = this->height();

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

	// 绘制背景
	painter.setPen(Qt::NoPen);
	painter.setBrush(m_hover ? m_bgHoverColor : m_bgColor);
	painter.drawRect(rect());
	// 绘制图片
	painter.drawPixmap(width * 0.3, height * 0.16, width * 0.4, height * 0.34, m_change ? m_hoverPixmap : m_pixmap);
	// 绘制文本
	painter.setPen(QPen(m_disable ? m_disableColor : m_color));
	painter.drawText(QRect(0, height * 0.62, width, height * 0.26), Qt::AlignCenter, m_change ? m_changeText : m_text);
}
  • 4
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
QT思维导图开发库是一种基于QT平台的软件开发工具,用于快速构建和定制思维导图功能的应用程序。通过使用这个开发库,开发者可以轻松地在其应用程序中添加思维导图功能,使用户可以创建、编辑和操作思维导图QT思维导图开发库提供了丰富的API和类,使开发者能够灵活地定制思维导图的外观和行为。开发者可以自定义节点的样式、颜色、字体等外观特性,也可以定义节点之间的连接方式和布局方式。此外,开发者还可以通过调用相应的API来使用户能够通过拖拽、缩放、移动等方式对思维导图进行操作。 QT思维导图开发库还提供了丰富的事件处理机制,使开发者能够方便地响应用户的操作。通过监听节点的点击、拖拽、改变大小等事件,开发者可以根据需求执行相应的逻辑操作,比如打开、删除、复制节点等。 除了基本的思维导图功能QT思维导图开发库还支持一些高级特性,如搜索、过滤、导出等。开发者可以通过调用相应的API来实现这些功能,使用户能够更方便地浏览和管理思维导图。 总之,QT思维导图开发库是一个功能强大、易于使用的工具,适用于需要在自己的应用程序中添加思维导图功能开发者。它提供了丰富的功能和灵活的定制选项,使开发者能够轻松地打造出符合自己需求的思维导图应用程序。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

浮生卍流年

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

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

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

打赏作者

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

抵扣说明:

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

余额充值