这里简单介绍QMenuBar和QMenu以及QAction是什么,其详细功能本文不做介绍,如果还不了解的朋友可以查阅Qt的帮助手册或浏览其它相关博客。如下图,软件中蓝色条框是QMenuBar用来承载QMenu,红色条框中“文件、编辑、构建……”为QMenu,而每个QMenu点击展开的粉色框内所有可以看到的均为QAction,而点击粉色框内所产生的动作即是绑定在对应QAction的槽函数(对应信号为QAction::triggered())。
他们之间的关系用框图表示大概像这样子(原谅我的画图水平),一个QMenuBar可以有多个QMenu,一个QMenu可以有多个QAction,每个QAction可以对应多个类成员函数(图中只画出了对应一个函数的情况)。
OK,简单的介绍到这里就结束了,接下来进入正文。QMenuBar虽然好用,但是也有一定的缺陷,它不能像Map、Vector、List等容器一样可以查找并返回自己的“子节点”。写这篇文章的目的,第一是为了解决QMenuBar没有准确定位其中某一个QMenu或QAction的函数接口;第二是做一下笔记,怕自己忘记。废话不多说了,直接贴代码。
头文件UartToolsMainWindow.h有关QMenuBar的关键部分代码。
//UartToolsMainWindow.hclass UartToolsMainWindow;typedef struct {QAction * action;QString name;void (UartToolsMainWindow::*func) ();
} MainMenuAction;typedef struct {QMenu * menu;QString name;QList<main_menu_action> actionsList;
} MainMenuModule;class UartToolsMainWindow: public QWidget
{
private:
//---------------------------Member--------------------------
//Menu barQMenuBar * mainWindowMenubar;QList<main_menu> mainWindowMenuList;
//---------------------------Functions------------------------
//Init menu barvoid InitMenubar(void);void NewActionToMenu(MainMenuModule*menu, QString actName, void (UartToolsMainWindow::*func) (void));//Menu bar action funcsvoid ShowConnectWindow(void);void ConnectC0Reconnect(void);void ConnectC0Disconnect(void);
};
源文件UartToolsMainWindow.cpp的InitMenubar()函数实现;
void UartToolsMainWindow::InitMenubar()
{this->mainWindowMenubar= new QMenuBar();this->mainWindowMenubar->setParent(this);MainMenuModule tmpMenu;MainMenuAction uName = "Connect";u = this->mainWindowMenubar->addMenu(tmpMenu.name);this->NewActionToMenu(&tmpMenu, "Serial", &UartToolsMainWindow::ShowConnectWindow);this->NewActionToMenu(&tmpMenu, "Reconnect", &UartToolsMainWindow::ConnectC0Reconnect);this->NewActionToMenu(&tmpMenu, "Disconnect", &UartToolsMainWindow::ConnectC0Disconnect);this->mainWindowMenuList.insert(this->mainWindowMenuList.length() + 1, tmpMenu);this->mainWindowMenubar->addSeparator();
//Easy to connect signal and slotfor (QList<mainMenu>::iterator menu_i = this->mainWindowMenuList.begin(); menu_i < this-&d(); menu_i++) {if ((*menu_i).menu) {for (int action_i = 0; action_i < (*menu_i).actionsList.size(); action_i++) {if ((*menu_i).actionsList.at(action_i).func) {QObject::connect(((*menu_i).actionsList.at(action_i).action), &QAction::triggered, this, (*menu_i).actionsList.at(action_i).func);}}}}
//End of Easy to connect signal and slot//set menubar and menu background colorthis->mainWindowMenubar->setStyleSheet("QMenuBar.item{background-color:#E0E0E0;}QMenuBar{background-color:#E0E0E0;}");this->mainWindowMenubar->show();return;
}
源文件UartToolsMainWindow.cpp的NewActionToMenu()函数实现;
void UartToolsMainWindow::NewActionToMenu(main_menu *menu, QString actName, void (UartToolsMainWindow::*func) (void))
{if (menu) {MainMenuAction tmpAction;tmpAction.name = actName;tmpAction.action = menu->menu->addAction(tmpAction.name);tmpAction.func = func;menu->actionsList.append(tmpAction);}return;
}
这个软件本身是实现了串口连接的功能,即通过串口连接目标板,进入shell命令行并使用shell命令操作。
觉得这篇文章对你有帮助的话,就留下一个赞吧^ v ^*
请尊重作者,转载还请注明出处!感谢配合~
[作者]: Imagine Miracle
[版权]: 本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
[本文链接]:
本文发布于:2024-02-02 15:23:32,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170685861144686.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |