zoukankan      html  css  js  c++  java
  • Qt QMenuBar和QMenu以及QAction巧妙的使用方法

    这里简单介绍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的函数接口;第二是做一下笔记,怕自己忘记。废话不多说了,直接贴代码。

    1、代码关键片段

    头文件uart_tools_mainwindow.h有关QMenuBar的关键部分代码。

    //uart_tools_mainwindow.h
    
    class uart_tools_mainwindow;
    
    typedef struct {
        QAction * action_p;
        QString name;
        void (uart_tools_mainwindow::*func) ();
    }main_menu_action;
    
    typedef struct {
        QMenu * menu_p;
        QString menu_name;
        QList<main_menu_action> actions_list;
    }main_menu;
    
    class uart_tools_mainwindow : public QWidget
    {
        Q_OBJECT
        ......
        ......
        ......
    private:    
    //---------------------------Member--------------------------
    //Menu bar
        QMenuBar * mainwindow_menubar;
        QList<main_menu> mainwindow_menu_list;
    //---------------------------Functions------------------------
    //Init menu bar
        void init_menubar(void);
        void new_action_to_menu(main_menu *menu, QString act_name, void (uart_tools_mainwindow::*func) (void));
        
    //Menu bar action funcs
    	void show_connect_window(void);
    	void connect_c0_reconnect(void);
        void connect_c0_disconnect(void);
    };    
    

    源文件uart_tools_mainwindow.cpp的init_menubar()函数实现;

    void uart_tools_mainwindow::init_menubar()
    {
        this->mainwindow_menubar = new QMenuBar();
        this->mainwindow_menubar->setParent(this);
    
        main_menu tmp_menu;
        main_menu_action tmp_action;
        tmp_menu.menu_name = "Connect";
        tmp_menu.menu_p = this->mainwindow_menubar->addMenu(tmp_menu.menu_name);
    
        this->new_action_to_menu(&tmp_menu, "Serial", &uart_tools_mainwindow::show_connect_window);
        this->new_action_to_menu(&tmp_menu, "Reconnect", &uart_tools_mainwindow::connect_c0_reconnect);
        this->new_action_to_menu(&tmp_menu, "Disconnect", &uart_tools_mainwindow::connect_c0_disconnect);
        
        this->mainwindow_menu_list.insert(this->mainwindow_menu_list.length() + 1, tmp_menu);
    
        this->mainwindow_menubar->addSeparator();
    //Easy to connect signal and slot
        for (QList<main_menu>::iterator menu_i = this->mainwindow_menu_list.begin(); menu_i < this->mainwindow_menu_list.end(); menu_i++) {
            if ((*menu_i).menu_p) {
                for (int action_i = 0; action_i < (*menu_i).actions_list.size(); action_i++) {
                    if ((*menu_i).actions_list.at(action_i).func) {
                        QObject::connect(((*menu_i).actions_list.at(action_i).action_p), &QAction::triggered, this, (*menu_i).actions_list.at(action_i).func);
                    }
                }
            }
        }
    //End of Easy to connect signal and slot
    
        //set menubar and menu background color
        this->mainwindow_menubar->setStyleSheet("QMenuBar.item{background-color:#E0E0E0;}QMenuBar{background-color:#E0E0E0;}");
        this->mainwindow_menubar->show();
        return;
    }    
    

    源文件uart_tools_mainwindow.cpp的new_action_to_menu()函数实现;

    void uart_tools_mainwindow::new_action_to_menu(main_menu *menu, QString act_name, void (uart_tools_mainwindow::*func) (void))
    {
        main_menu_action tmp_action;
    
        tmp_action.name = act_name;
        tmp_action.action_p = menu->menu_p->addAction(tmp_action.name);
        tmp_action.func = func;
        menu->actions_list.insert(menu->actions_list.length() + 1, tmp_action);
    
        return;
    }
    

    2、运行结果展示

    这个软件本身是实现了串口连接的功能,即通过串口连接目标板,进入shell命令行并使用shell命令操作。
    在这里插入图片描述

  • 相关阅读:
    (转)ab(apachebench)测试与loadrunner
    hibernate学习总结
    Oracle 11G在用EXP 导入、导出时,若有空表对导入导出中遇到的问题的解决
    Nginx可以做什么
    Oracle的表空间、用户和表的区别和联系
    oracle11g 导出表报EXP-00011:table不存在。
    tomcat、nginx、apache、tengine都是什么,及其作用
    注解和依赖注入框架
    js中innerHTML与innerText的用法与区别
    Linux中 /boot 目录介绍
  • 原文地址:https://www.cnblogs.com/ImagineMiracle-wxn/p/Qt_QMenuBar_IM_Shell.html
Copyright © 2011-2022 走看看