前言: 作为一个使用C++做客户端开发的半个开发人员,自然是然不开cmake的。初识cmake还是在githup上寻找轮子的时候。大多数轮子里都会包含一个叫做CMakeLists.txt的文件,这时就需要cmake来生成编译文件了,每次都得花上很多时间在配置cmake上,现在回想那段日子,简直就是噩梦。也怪自己当初不爱文档,只爱百度。 然是这样一个东西,现在却觉得是一个十分方便的工具,遂分享一下使用心得。 CMake: CMake是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程)。他能…

2021年2月22日 0条评论 4854点热度 7人点赞 大脸猫 阅读全文

FreeCAD中可以同时打开多个工程,每个工程都会有一两个与之对应的视窗,当同时打开多个工程时freeCAD是如何管理这些视窗的呢? 源码中定义了一个叫做BaseView的抽象类,想要与Document(工程对应的数据管理类)与之对应,最好是继承这个类。这个类中实现了一些与Document建立联系的方法,通过这些方法可以将BaseView绑定到Document中,在双方的对象中都可以获取到对方,十分的方便。 class GuiExport BaseView : public Base::BaseClass { TY…

2021年1月23日 0条评论 3077点热度 1人点赞 大脸猫 阅读全文

在使用C++进行程序开发过程中,免不了对std::cout\cerr的使用。我一般用于打印程序运行中的一些关键信息,以便于后面维护时方便灭虫。这两个输出语句都是将信息打印到控制台中,如果是GUI程序,那总不能在程序运行的时候还让控制台也跟着启动吧,这很不优雅。 比较好做法是将这些信息输出到特定的文件中,这样既不用带着控制台,又可以在程序崩溃之后,也能在文件中找到程序运行的流程。要实现这样功能我们需要对std::cerr\cout进行重定向。 这里主要使用ruduf函数来进行重定向 streambuf* rdbuf(…

2021年1月23日 0条评论 5658点热度 4人点赞 大脸猫 阅读全文

前言 最近一个接到这样一个需求,需要在FreeCAD的中加入一个自定义的工程文件。这需要搞懂原本框架中的新建工程、打开工程到保存撤销回复再到保存另存的一整套流程,还需要搞懂工程与UI之间的对应关系。于是开始翻看FreeCAD得源代码,一边看一边惊呼,居然还这样操作。然是我才疏学浅,这源代码使我受益匪浅。 整个工程得流程,可以分为三个部分: Command。这部分主要往程序主框架中注册一些命令,如新建、打开、保存等这些基本操作,然后将这些命令放到界面上去供用户使用。 UI。这个主要指工程所对应的ui,比如在一个模型工…

2020年11月26日 0条评论 3178点热度 3人点赞 大脸猫 阅读全文

众所周知qt中,要将一歌窗口嵌入另一个窗口只需要调用setParent()函数就可以了。但是setparent()参数必须是qwidget对象的指针,很遗憾的是桌面并不是一个qwidget对象,所以并不能这么做。 在查阅了一些资料之后,发现实现类似的效果都是通过winapi实现的,所以我记录下来的也只是在windows平台上的实现方法。 在winapi中提供了一个SetParent()的函数,功能与qt的setParent函数如出一辙,它的原型是这样的。 HWND SetParent(HWND hWndChild,…

2020年11月8日 3条评论 6648点热度 45人点赞 大脸猫 阅读全文

wordpress框架中的get_categories($args)可以获取所有分类目录的信息。 $args参数定义如下 $args = array( 'type' => 'post', 'child_of' => 0, 'parent' => '', 'orderby' => 'name', 'order' => 'ASC', #排序方式 'hide_empty' => 1, #是否隐藏空的目录 默认隐藏(经测试传入布尔类型也可以) 'hierarchical' => 1…

2020年11月2日 0条评论 3251点热度 0人点赞 大脸猫 阅读全文

lua是一个比较简单的脚本语言,我们可以用C/C++对它进行扩展。当我们使用C++与lua进行交互的时候,因为两种语言的数据结构是有很大的不同的,所以这个时候我们是通过虚拟栈来进行信息的交换的。 可以把虚拟栈看做一种数据容器,它可以存放lua中的任何数据类型包括函数。 luac //将栈的索引转换为正索引 LUA_API int (lua_absindex) (lua_State *L, int idx); //获取栈顶的索引(即栈的大小) LUA_API int (lua_gettop) (lua_State *…

2020年11月2日 0条评论 3287点热度 0人点赞 大脸猫 阅读全文

下载lua的源代码 https://www.lua.org/ 下载好之后,将源代码直接加入自己的工程。 在C++中调用lua代码主要有以下几个步骤 使用luaL_newstate()函数创建一个lua虚拟机。 使用luaL_openlib()函数载入lua基本库。 使用luaL _dostring()或者luaL_dofile()载入一个lua脚本。 使用lua_getglobal()将脚本中的全局变量压入栈,如果传入的是函数名那则相当于将函数指针压入栈顶。 调用栈中的数据。 C++代码 extern "C"{ #…

2020年10月15日 0条评论 3668点热度 3人点赞 大脸猫 阅读全文

在自己的C++中调用lua脚本时,遇到了一个比较麻烦的问题。因为在lua脚本中有调用C++提供的一些函数导致lua脚本再正常的lua运行环境中是没办法调试运行,但是不调试运行的脚本会有很多问题,比如语法错误,或者运行时的逻辑错误导致表的索引越界。最开始遇到这些问题的时候我只能在脚本中写相当多的print,这样来调试,但是后面脚本越写越复杂这样的调试方法效率就相当低了。 然后谷歌了一下,发现lua本身在运行脚本之前本来就会检查 一般在调用脚本之前我们会用luaL_dostring()或者luaL_dofile()载入…

2020年10月14日 0条评论 5836点热度 35人点赞 大脸猫 阅读全文

最近给项目做一个拓展的功能,用软件的仿真输出数据对仿真的输入进行优化。通过某种优化算法去修改仿真的输入数据使得输出数据接近预期值。整个功能的业务流程差不多是这样的。   最开始在思考程序结构的时候觉得有两个比较难的地方。 如何能让用户足够自由的去定义从输出到输入的这么一个过程。 如何解析用户输入的数学表达式。 关于第一点如果只是在输入界面上增加一些输入选项,那将很难达到 “足够自由的去定义输入” 的这么一个目标。要达到这个目标,需要输入的数据太多了,例如指定优化哪些参数、指定仿真结果数据的筛选方式、结果数…

2020年9月20日 0条评论 2925点热度 0人点赞 大脸猫 阅读全文
134567