当前位置:网站首页>Qt实现思维导图功能(二)
Qt实现思维导图功能(二)
2022-06-13 01:43:00 【浮生卍流年】
百度网盘体验地址:
链接: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、 Improvement of warehousing management function
- 开发者来稿|AMD赛灵思中文论坛分享 - 提问的智慧
- What is Google plus large text ads? How to use it?
- H5 open the app. If the app is not downloaded, jump to the download page. If the app has been downloaded, wake up the app
- Introduction to common ROS commands
- The storage structure of a tree can adopt the parent representation, that is, the parent pointer array representation. Try to give the corresponding class definition. Each tree node contains two membe
- Record the VMware installation process of VMware Tools and some problems encountered
- 3、 Upload fabric photos to SQL server and provide name to display fabric photos
- A DPU architecture without CPU: Hyperion
- What is solid angle
猜你喜欢

Implementation and design of JMeter interface test database assertion for CSDN salary increase technology

csdn涨薪技术之Jmeter接口测试数据库断言的实现与设计

Go JWT learning summary

What is solid angle

Realization of flip animation

matplotlib画图中文乱码

服务器安装jupyterlab以及远程登录配置

四、入库管理功能的完善

30: Kakfa simulates JSON data generation and transmission
![[Andoid][踩坑]CTS 11_r3开始出现的testBootClassPathAndSystemServerClasspath_nonDuplicateClasses FAIL问题分析](/img/b5/7ea603775dc0448368d209de037a43.png)
[Andoid][踩坑]CTS 11_r3开始出现的testBootClassPathAndSystemServerClasspath_nonDuplicateClasses FAIL问题分析
随机推荐
Spit bubbles (stack)
Use koa to mock data and set cross domain issues
STM32 3*3矩阵按键(寄存器版本)
URI, URL and urn difference, relation and syntax diagram
Three paradigms of database
How to solve practical problems through audience positioning?
Differences among bio, NiO and AIO
Add default right-click menu
Design of distributed game server
服务器安装jupyterlab以及远程登录配置
Server installation jupyterab and remote login configuration
TensorFlow 2. X multi graphics card distributed training
Simple operation of MySQL database
Numpy multidimensional array transpose transpose
Reinstall opencv and step on the pit.
五、库存查询功能的完善
关于tkinter.Canvas 不显示图片的问题
Record the VMware installation process of VMware Tools and some problems encountered
Network communication tcp/ip
Tweens of phaser3