C++ 可视化编程

最近因为要 Debug 一个很复杂的图形操作,所以决定用 Qt 写一些接口进行可视化调试。

环境搭建

选择使用 Qt::Widgets 开发,相比 Qt:QML 更成熟,相比 Qt::Gui 集成化程度更高。

先用 Qt 创建项目,再在 VS 里编辑需要改成用 Qt 的 MingW 编译以及在 CMakeLists.txt 中设置 CMAKE_PREFIX_PATH。

1
set(CMAKE_PREFIX_PATH $ENV{QT_DIR})

类规范

  1. 类名加 Z;
  2. 类成员变量 _ 开头;
  3. 类成员函数首字母小写;
  4. 类成员变量书写顺序:尽量内存对齐;
  5. 类成员函数书写顺序,private -> protected -> public,构造 -> 析构 -> Get -> Set -> 重载运算符 -> 其他功能,inline 的函数要尽量放前面

软件逻辑

因为第一次做软件,所以还是好好梳理一下。

  1. 一开始运行是空的,所以首先要让软件打开时默认最大化,缩小时应该默认占用 3/4 个屏幕;

  2. 保存用户设置;

    一直存取不了 json 文件,找了好久才发现要用绝对路径读取文件,因为那个相对路径时根据 .exe 的位置来的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class ZMainWindow : public QMainWindow
{
Q_OBJECT
private:
bool _isMaxShow;

protected:
public:
ZMainWindow(QWidget* parent = nullptr) {}

inline bool isMaxShow() const { return _isMaxShow; }

inline void setIsMaxShow(bool isMaxShow) { _isMaxShow = isMaxShow; }

void initialize();
};
扩展了一下 QMainWindow,不然做不到保存是否最大化的设置。
  1. 很喜欢 Blender,所以界面也要尽量仿造;

除了最上面一排是固定的,剩下的都是 docker。

说实话 Qt 的 QDockWidget有点过于垃圾了,干脆不用 Dock 了,以后用 Vulkun 重写。

  1. 所有的图形应该共用一只画笔;

    共用一支画笔需要在 MainWindow 里初始化静态函数,再在 GraphicsItem 里设置 Pen,最后在 paint() 里复制 pen,不知道这样性能怎么样。

  2. 在外部操作画图形;

    基本上前面搞定,后面就是水到渠成了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 获取场景
QGraphicsScene* scene = (mainWindow.views()[mainWindow.currentViewindex()])->scene();

// 添加图形
{
ZGraphicsPathItem* item = new ZGraphicsPathItem();
item->setPen(*mainWindow.pen());

// TODO: 需要注意坐标轴方向不一致,可能需要调整数据
item->addStartPoint(QPointF(0, 0));
item->addLineSegment(QPointF(100, 100));
item->addCubicCurve(QPointF(125, 125), QPointF(175, 125), QPointF(200, 100));

scene->addItem(item);
}
如果想用按钮控制,著需要引入槽即可。
  1. 画布拖拽;

    一直没找到方法,懒得做了。

  2. 动态的画图形。

    没想到什么好办法,应该要用多线程来做。

项目框架

项目地址