目录
NodeStyle.hpp
#pragma once
#include <QtGui/QColor> // 包含 QColor 类的头文件
#include "Export.hpp" // 导出宏的头文件,可能用于设置 DLL 的访问权限
#include "Style.hpp" // 引入 Style 类的头文件,该类是 NodeStyle 的基类
namespace QtNodes {
// 使用 NODE_EDITOR_PUBLIC 宏,可能是用于控制类的导出和可见性
class NODE_EDITOR_PUBLIC NodeStyle : public Style
{
public:
// 三个构造方法,分别用于创建 NodeStyle 对象的不同方式
NodeStyle(); // 默认构造方法
NodeStyle(QString jsonText); // 带参数构造方法,接受 JSON 文本作为输入
NodeStyle(QJsonObject const &json); // 带参数构造方法,接受 JSON 对象作为输入
// 使得能够调用默认的析构函数
virtual ~NodeStyle() = default;
public:
// 静态方法,用于设置节点风格,通过类名直接设置
static void setNodeStyle(QString jsonText);
public:
// 实现父类中的纯虚函数,用于加载节点样式的配置信息
void loadJson(QJsonObject const &json) override;
// 将 NodeStyle 对象转换为 QJsonObject 对象
QJsonObject toJson() const override;
public:
// 下面是一系列成员变量,用于表示节点样式的各种颜色属性
QColor NormalBoundaryColor; // 普通边界颜色
QColor SelectedBoundaryColor; // 选中边界颜色
QColor GradientColor0; // 渐变颜色0
QColor GradientColor1; // 渐变颜色1
QColor GradientColor2; // 渐变颜色2
QColor GradientColor3; // 渐变颜色3
QColor ShadowColor; // 阴影颜色
QColor FontColor; // 字体颜色
QColor FontColorFaded; // 淡化的字体颜色
QColor ConnectionPointColor; // 连接点颜色
QColor FilledConnectionPointColor; // 填充的连接点颜色
QColor WarningColor; // 警告颜色
QColor ErrorColor; // 错误颜色
// 下面是一系列浮点数类型的成员变量,用于表示节点样式的各种属性值
float PenWidth; // 画笔宽度
float HoveredPenWidth; // 鼠标悬停时的画笔宽度
float ConnectionPointDiameter; // 连接点直径
float Opacity; // 不透明度
};
} // namespace QtNodes
NodeStyle.cpp
#include "NodeStyle.hpp"
#include <iostream>
#include <QtCore/QJsonArray>
#include <QtCore/QJsonObject>
#include <QtCore/QJsonValueRef>
#include <QtCore/QDebug>
#include "StyleCollection.hpp" // 为了与样式配置的集合进行交互。
using QtNodes::NodeStyle;
// 用于初始化资源。内联函数通常用于定义非常简单的函数,以减少函数调用的开销。
// 在构造函数中调用
inline void initResources()
{
Q_INIT_RESOURCE(resources); // 调用了Qt的宏,可能用于初始化资源文件(如图标、样式表等)。
}
// 3种构造函数,给自身成员变量赋值
// 在构造函数中,进行了资源初始化并加载了默认的节点样式配置。
NodeStyle::NodeStyle()
{
// Explicit resources inialization for preventing the static initialization
// order fiasco: https://isocpp.org/wiki/faq/ctors#static-init-order
initResources();
// This configuration is stored inside the compiled unit and is loaded statically
loadJsonFile(":DefaultStyle.json");
}
// 带参数构造函数的定义,接受一个字符串 jsonText,用于加载节点样式配置。
NodeStyle::NodeStyle(QString jsonText)
{
loadJsonText(jsonText); // 调用父类方法-》调用父类中被实现纯虚函数loadJson->给子类成员变量赋值
}
NodeStyle::NodeStyle(QJsonObject const &json)
{
loadJson(json);
}
// setNodeStyle静态方法,调用风格管理类的静态方法,设置节点风格
void NodeStyle::setNodeStyle(QString jsonText)
{
NodeStyle style(jsonText);
StyleCollection::setNodeStyle(style);
}
// 根据预处理器中是否定义了 STYLE_DEBUG 宏来包含或排除其中的代码。
// 这是一种用于调试目的的编译指令。
#ifdef STYLE_DEBUG
#define NODE_STYLE_CHECK_UNDEFINED_VALUE(v, variable) \
{ \
if (v.type() == QJsonValue::Undefined || v.type() == QJsonValue::Null) \
qWarning() << "Undefined value for parameter:" << #variable; \
}
#else
#define NODE_STYLE_CHECK_UNDEFINED_VALUE(v, variable)
#endif
// 这些宏用于处理节点样式配置中的各种属性值,例如颜色、浮点数等。
#define NODE_STYLE_READ_COLOR(values, variable) \
{ \
auto valueRef = values[#variable]; \
NODE_STYLE_CHECK_UNDEFINED_VALUE(valueRef, variable) \
if (valueRef.isArray()) { \
auto colorArray = valueRef.toArray(); \
std::vector<int> rgb; \
rgb.reserve(3); \
for (auto it = colorArray.begin(); it != colorArray.end(); ++it) { \
rgb.push_back((*it).toInt()); \
} \
variable = QColor(rgb[0], rgb[1], rgb[2]); \
} else { \
variable = QColor(valueRef.toString()); \
} \
}
#define NODE_STYLE_WRITE_COLOR(values, variable) \
{ \
values[#variable] = variable.name(); \
}
#define NODE_STYLE_READ_FLOAT(values, variable) \
{ \
auto valueRef = values[#variable]; \
NODE_STYLE_CHECK_UNDEFINED_VALUE(valueRef, variable) \
variable = valueRef.toDouble(); \
}
#define NODE_STYLE_WRITE_FLOAT(values, variable) \
{ \
values[#variable] = variable; \
}
// 关键成员函数,实现父类的纯虚函数
// 用于给自身成员变量赋值,即《节点》样式配置。
void NodeStyle::loadJson(QJsonObject const &json)
{
QJsonValue nodeStyleValues = json["NodeStyle"];
QJsonObject obj = nodeStyleValues.toObject();
NODE_STYLE_READ_COLOR(obj, NormalBoundaryColor);
NODE_STYLE_READ_COLOR(obj, SelectedBoundaryColor);
NODE_STYLE_READ_COLOR(obj, GradientColor0);
NODE_STYLE_READ_COLOR(obj, GradientColor1);
NODE_STYLE_READ_COLOR(obj, GradientColor2);
NODE_STYLE_READ_COLOR(obj, GradientColor3);
NODE_STYLE_READ_COLOR(obj, ShadowColor);
NODE_STYLE_READ_COLOR(obj, FontColor);
NODE_STYLE_READ_COLOR(obj, FontColorFaded);
NODE_STYLE_READ_COLOR(obj, ConnectionPointColor);
NODE_STYLE_READ_COLOR(obj, FilledConnectionPointColor);
NODE_STYLE_READ_COLOR(obj, WarningColor);
NODE_STYLE_READ_COLOR(obj, ErrorColor);
NODE_STYLE_READ_FLOAT(obj, PenWidth);
NODE_STYLE_READ_FLOAT(obj, HoveredPenWidth);
NODE_STYLE_READ_FLOAT(obj, ConnectionPointDiameter);
NODE_STYLE_READ_FLOAT(obj, Opacity);
}
// 定义了一个成员函数,用于将节点样式配置转换为 QJsonObject 对象,以便保存到JSON格式。
QJsonObject NodeStyle::toJson() const
{
QJsonObject obj;
NODE_STYLE_WRITE_COLOR(obj, NormalBoundaryColor);
NODE_STYLE_WRITE_COLOR(obj, SelectedBoundaryColor);
NODE_STYLE_WRITE_COLOR(obj, GradientColor0);
NODE_STYLE_WRITE_COLOR(obj, GradientColor1);
NODE_STYLE_WRITE_COLOR(obj, GradientColor2);
NODE_STYLE_WRITE_COLOR(obj, GradientColor3);
NODE_STYLE_WRITE_COLOR(obj, ShadowColor);
NODE_STYLE_WRITE_COLOR(obj, FontColor);
NODE_STYLE_WRITE_COLOR(obj, FontColorFaded);
NODE_STYLE_WRITE_COLOR(obj, ConnectionPointColor);
NODE_STYLE_WRITE_COLOR(obj, FilledConnectionPointColor);
NODE_STYLE_WRITE_COLOR(obj, WarningColor);
NODE_STYLE_WRITE_COLOR(obj, ErrorColor);
NODE_STYLE_WRITE_FLOAT(obj, PenWidth);
NODE_STYLE_WRITE_FLOAT(obj, HoveredPenWidth);
NODE_STYLE_WRITE_FLOAT(obj, ConnectionPointDiameter);
NODE_STYLE_WRITE_FLOAT(obj, Opacity);
QJsonObject root;
root["NodeStyle"] = obj;
return root;
}
默认风格设置
{
"GraphicsViewStyle": {
"BackgroundColor": [53, 53, 53],
"FineGridColor": [60, 60, 60],
"CoarseGridColor": [25, 25, 25]
},
"NodeStyle": {
"NormalBoundaryColor": [255, 255, 255],
"SelectedBoundaryColor": [255, 165, 0],
"GradientColor0": "gray",
"GradientColor1": [80, 80, 80],
"GradientColor2": [64, 64, 64],
"GradientColor3": [58, 58, 58],
"ShadowColor": [20, 20, 20],
"FontColor" : "white",
"FontColorFaded" : "gray",
"ConnectionPointColor": [169, 169, 169],
"FilledConnectionPointColor": "cyan",
"ErrorColor": "red",
"WarningColor": [128, 128, 0],
"PenWidth": 1.0,
"HoveredPenWidth": 1.5,
"ConnectionPointDiameter": 8.0,
"Opacity": 0.8
},
"ConnectionStyle": {
"ConstructionColor": "gray",
"NormalColor": "darkcyan",
"SelectedColor": [100, 100, 100],
"SelectedHaloColor": "orange",
"HoveredColor": "lightcyan",
"LineWidth": 3.0,
"ConstructionLineWidth": 2.0,
"PointDiameter": 10.0,
"UseDataDefinedColors": false
}
}