0.前言
通过前文的学习,我们已经建立了自己的模块PersonalReverse,可以在FreeCAD中打开,还有一个可以在控制台打印Hello World!\n
的图标命令,而且工作台Workbench的图标和命令的图标都设置成了我们自己的。通过修改Gui下的CMakeLists.txt,我们将自己的Workbench图标添加到了项目中。
现在,我们将更进一步分析Gui下的文件
1.Module注册
由于我们是C++的Workbench开发,我们的PersonalReverseGui模块实际不需要提供任何函数,所以AppPersonalReverseGui.cpp
不用修改。
2.Command注册(Command.cpp)
1.命令宏
每一个命令都定义其X类,并继承自Comand类,X为该命令的全局唯一命名。 使用宏,四选一:
DEF_STD_CMD_A(X) //可以在isActive中添加激活条件,不满足则图标无法被点击
DEF_STD_CMD(X) //一直处于激活状态
DEF_STD_CMD_AC(X)
DEF_STD_CMD_C(X) //可以添加创建命令createAction
每一个命令都必须定义其同名构造函数,并继承父类Command的构造方法。重新分配其所属的APP,Group,和提示词。
2.命令定义
以下是利用模板生成后,添加的一个测试命令CmdPersonalReverseTest
// 命令宏
DEF_STD_CMD(CmdPersonalReverseTest)
// 这里定义了命令的基本信息
CmdPersonalReverseTest::CmdPersonalReverseTest()
:Command("PersonalReverse_Test")
{
sAppModule = "PersonalReverse";
sGroup = QT_TR_NOOP("PersonalReverse");
sMenuText = QT_TR_NOOP("Hello");
sToolTipText = QT_TR_NOOP("PersonalReverse Test function");
sWhatsThis = "PersonalReverse_Test";
sStatusTip = QT_TR_NOOP("PersonalReverse Test function");
sPixmap = "actions/FitSurface";
sAccel = "CTRL+H";
}
// 命令点击时会调用该函数
void CmdPersonalReverseTest::activated(int)
{
Base::Console().Message("Hello, World!\n");
}
3.将命令注册到命令管理器中
void CreatePersonalReverseCommands(void)
{
Gui::CommandManager &rcCmdMgr = Gui::Application::Instance->commandManager();
rcCmdMgr.addCommand(new CmdPersonalReverseTest());
}
3.绑定三维视图ViewProvider
4.注册工作台(Workbench.cpp)
- 宏定义:从StdWorkbench继承
TYPESYSTEM_SOURCE(PersonalReverseGui::Workbench, Gui::StdWorkbench)
- 设置菜单栏
Gui::MenuItem* Workbench::setupMenuBar() const
{
Gui::MenuItem* root = StdWorkbench::setupMenuBar();
Gui::MenuItem* item = root->findItem( "&Windows" );
Gui::MenuItem* test = new Gui::MenuItem;
root->insertItem( item, test );
test->setCommand("PersonalReverse"); //这里将PersonalReverse模块加载到了菜单栏(Gui中添加了App定义的模块)
*test << "PersonalReverse_Test"; //这里将测试命令添加到了菜单栏
return root;
}
- 设置工具栏
Gui::ToolBarItem* Workbench::setupToolBars() const
{
Gui::ToolBarItem* root = StdWorkbench::setupToolBars();
Gui::ToolBarItem* test = new Gui::ToolBarItem(root);
test->setCommand( "PersonalReverse Tools" );
*test << "PersonalReverse_Test"; //这里将测试命令添加到了工具栏
return root;
}