响应菜单项
现在,我们已经将我们的 DoNothing 插件作为一个菜单项加入到 Qt Creator 中。既然菜单项就是一个QAction
,我们当然可以通过连接triggered(bool)
或者toggled(bool)
信号,响应 trigger、toggled 事件。下面的代码显示了如何去做:
class DoNothingPlugin : public ExtensionSystem::IPlugin { Q_OBJECT public: ... private slots: void about(); }; bool DoNothingPlugin::initialize(const QStringList& args, QString *errMsg) { Q_UNUSED(args); Q_UNUSED(errMsg); ...... Core::Command* cmd = am->registerAction( new QAction(this), "DoNothingPlugin.AboutDoNothing", Core::Context(Core::Constants::C_GLOBAL)); ...... connect(cmd->action(), SIGNAL(triggered(bool)), this, SLOT(about())); ...... return true; } void DoNothingPlugin::about() { QMessageBox::information( 0, "About DoNothing Plugin", "Seriously dude, this plugin does nothing" ); }
我们重新编译下插件,然后运行 Qt Creator,点击一下 DoNothing 菜单项,就会弹出一个对话框:
如果你想使用 Qt Creator 主窗口作为 parent,那么只要按照下面的代码进行修改:
void DoNothingPlugin::about() { QMessageBox::information( Core::ICore::instance()->mainWindow(), "About DoNothing Plugin", "Seriously dude, this plugin does nothing" ); }
添加菜单
前面我们介绍了如何添加菜单项,下面我们将介绍如何向 Qt Creator 添加菜单。添加菜单,我们不能使用Core::Command
,而是应该使用Core::ActionContainer
,将其添加到MENU_BAR
上面。下面的代码显示了如何进行这一操作:
bool DoNothingPlugin::initialize(const QStringList& args, QString *errMsg) { Q_UNUSED(args); Q_UNUSED(errMsg); Core::ActionManager* am = Core::ICore::instance()->actionManager(); // Create a DoNothing menu Core::ActionContainer* ac = am->createMenu("DoNothingPlugin.DoNothingMenu"); ac->menu()->setTitle("DoNothing"); // Create a command for "About DoNothing". Core::Command* cmd = am->registerAction( new QAction(this), "DoNothingPlugin.AboutDoNothing", Core::Context(Core::Constants::C_GLOBAL)); cmd->action()->setText("About DoNothing"); connect(cmd->action(), SIGNAL(triggered(bool)), this, SLOT(about())); // Add DoNothing menu to the menubar am->actionContainer(Core::Constants::MENU_BAR)->addMenu(ac); // Add the "About DoNothing" action to the DoNothing menu ac->addAction(cmd); return true; }
下面我们来看一下运行结果
修改菜单或菜单项的位置
现在,我们已经了解如何向 Qt Creator 添加菜单项,如何向 Qt Creator 添加菜单。只不过还有一个问题:我们添加的菜单或者菜单项都是在第一个位置。如果修改新增菜单或菜单项的位置呢?下面来看看这一段代码,我们要将“DoNothing”菜单放到“Help”前面:
bool DoNothingPlugin::initialize(const QStringList& args, QString *errMsg) { Q_UNUSED(args); Q_UNUSED(errMsg); Core::ActionManager* am = Core::ICore::instance()->actionManager(); // Create a DoNothing menu Core::ActionContainer* ac = am->createMenu("DoNothingPlugin.DoNothingMenu"); ac->menu()->setTitle("DoNothing"); // Create a command for "About DoNothing". Core::Command* cmd = am->registerAction( new QAction(this), "DoNothingPlugin.AboutDoNothing", Core::Context(Core::Constants::C_GLOBAL)); cmd->action()->setText("About DoNothing"); connect(cmd->action(), SIGNAL(triggered(bool)), this, SLOT(about())); // Insert the "DoNothing" menu between "Window" and "Help". QMenu* helpMenu = am->actionContainer(Core::Constants::M_HELP)->menu(); QMenuBar* menuBar = am->actionContainer(Core::Constants::MENU_BAR)->menuBar(); menuBar->insertMenu(helpMenu->menuAction(), ac->menu()); // Add the "About DoNothing" action to the DoNothing menu ac->addAction(cmd); return true; }
重新编译之后运行一下:
现在,DoNothing 菜单已经在 Help 前面,而不是在菜单栏的第一位了。同样,我们可以用类似的方法将菜单项插入到任意的位置。代码是类似的,这里不再赘述。
附件下载:DoNothing 插件文件
1 个评论
期待您关于有限状态机FSM方面的分享~