Qt:16.窗口_菜单栏(菜单栏的介绍、ui界面创建菜单/菜单项的方法、通过代码方式创建菜单、为动作绑定槽函数、为动作绑定快捷键、 为动作添加动作、分割线,分隔开部分动作、为动作/菜单项设置图标)

目录

1.菜单栏的介绍:

2.ui界面创建菜单/菜单项的方法:

3.通过代码方式创建菜单:

 4.为动作绑定槽函数:

5.为动作绑定快捷键:

6. 为动作添加动作:

7.分割线,分隔开部分动作:

8.为动作/菜单项设置图标:

9.手动创建菜单栏导致的内存泄漏问题:


1.菜单栏的介绍:

  • 在 Qt 中,菜单栏是一个常用的 GUI 组件,用于组织和管理应用程序的各种命令。
  • QMenuBar 是 Qt 提供的菜单栏类,它通常位于窗口的顶部,并包含一个或多个菜单,每个菜单又包含一个或多个动作项(QAction)。
  • 一个主窗口最多只有一个菜单栏。

        

2.ui界面创建菜单/菜单项的方法:

3.通过代码方式创建菜单:

  • 创建菜单栏:QMenuBar* menuBar = new menuBar();
  • 将创建的菜单栏设置到窗口:this->setMenuBar(menuBar);
  • 创建菜单项:QMenu* menu1=new QMenu("菜单项名称");
  • 将菜单项添加到菜单栏:menuBar->addMenu(menu1);
  • 创建菜单项的动作:QAction* action1=new QAction("动作名称");
  • 将动作赋给菜单项:menu1->addAction(action1);
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    //创建菜单栏
    QMenuBar* menuBar=new QMenuBar();
    this->setMenuBar(menuBar);

    //创建菜单项
    QMenu* menu1=new QMenu("选项1");
    QMenu* menu2=new QMenu("选项2");
    QMenu* menu3=new QMenu("选项3");
    QMenu* menu4=new QMenu("选项4");
    QMenu* menu5=new QMenu("选项5");

    //将菜单项添加到菜单栏
    menuBar->addMenu(menu1);
    menuBar->addMenu(menu2);
    menuBar->addMenu(menu3);
    menuBar->addMenu(menu4);
    menuBar->addMenu(menu5);

    //创建动作
    QAction* action1=new QAction("1");
    QAction* action2=new QAction("2");
    QAction* action3=new QAction("3");
    QAction* action4=new QAction("4");
    QAction* action5=new QAction("5");

    //为菜单项赋予动作
    menu1->addAction(action1);
    menu2->addAction(action2);
    menu3->addAction(action3);
    menu4->addAction(action4);
    menu5->addAction(action5);

}

 4.为动作绑定槽函数:

  • 当点击动作时,会触发一个triggered信号。
  • connect(action1,&QAction::triggered,this,&MainWindow::槽函数);

5.为动作绑定快捷键:

  • 在字段后加一个圆括号,里面写‘ &+键位 ’ ,就可以绑定快捷键。

        

        

  • 绑定后,会在字段后面显示快捷键位,但是不会显示&符号。
  • 使用alt+键位,使用快捷键。比如要打开选项1,就是由:alt+a。

6. 为动作添加动作:

  • 此时将动作看作一个菜单,为其添加动作。类似于菜单的子菜单。
  • 可以无线向下延申出子菜单。

        

        

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    //创建菜单栏
    QMenuBar* menuBar=new QMenuBar();
    this->setMenuBar(menuBar);

    //创建父菜单
    QMenu* menu_1=new QMenu("父菜单");
    menuBar->addMenu(menu_1);

    //创建子菜单
    QMenu* menu_2=new QMenu("子菜单");
    menu_1->addMenu(menu_2);

    //创建动作
    QAction* action1=new QAction("动作1");
    QAction* action2=new QAction("动作2");
    QAction* action3=new QAction("动作3");
    //将动作添加到子菜单
    menu_2->addAction(action1);
    menu_2->addAction(action2);
    menu_2->addAction(action3);
}

7.分割线,分隔开部分动作:

  • 使用QMenu类的addSeparator()方法,添加分割线。

        

8.为动作/菜单项设置图标:

  •  对动作使用setIcon(QIcon(qrc路径))方法,为动作添加图标。
  • 同时也可以为菜单项添加图标,但是菜单项设置图标后,就不再显示文本,只会显示图标。

9.手动创建菜单栏导致的内存泄漏问题:

  • 如果在创建文件时,勾选了自动生成ui文件,编译器就会自动生成一个菜单栏。

        

  • 如果我们再手动new一个菜单栏,并且将这个new的菜单栏设置到窗口,就会导致编译器自动生成的菜单栏脱离对象树。
  • 脱离对象树之后,就无法对这个菜单栏对象进行释放,就会导致内存泄漏。
  • 虽然这种泄漏。几乎不会有什么影响,但是还是解决了为好,下面是解决方法。

  • 使用新的写法:
  • QMenuBar* menuBar=this->menuBar();
  • 来代替旧的写法:
  • QMenuBar* menuBar=new QMenuBar();+ this->setMenuBar(menuBar);

  • 这样写,如果已经存在QMenuBar对象,会返回这个对象。
  • 如果不存在QMenuBar对象,就会先生成一个QMenuBar对象,再返回。

  • 8
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
1. 创建MDI主窗口Qt Creator中创建一个新的Qt Widgets应用程序项目,选择“Main Window”模板。然后,将mainwindow.ui文件中的QWidget更改为QMdiArea,并将其设置为MainWindow的中心窗口。 2. 制作菜单栏Qt Creator的设计模式下,可以从左侧的Widgets栏中拖动QMenuBar控件到MainWindow的顶部。然后,在属性编辑器中,单击“编辑动作”按钮以打开菜单编辑器。在此处,您可以添加菜单和子菜单,以及与它们相关联的动作。 3. 制作工具栏 在Qt Creator的设计模式下,可以从左侧的Widgets栏中拖动QToolBar控件到MainWindow的顶部。然后,您可以从属性编辑器中添加动作,或者单击“编辑动作”按钮以打开动作编辑器,并在其中添加动作。 4. 将动作菜单和工具栏相关联 在动作编辑器中,您可以将动作菜单和工具栏相关联。例如,您可以将一个动作添加到文件菜单中,并将其命名为“打开”,然后将其添加到工具栏中。这样,用户可以通过单击菜单项或工具栏按钮来执行相同的操作。 5. 在代码中处理动作 在mainwindow.cpp文件中,将动作与其函数相关联。例如,如果您将“打开”动作添加菜单和工具栏中,则可以将其函数实现为打开文件对话框,并将所选文件加载到QMdiArea中的子窗口中。 这些步骤可以帮助您创建一个具有菜单栏和工具栏的MDI主窗口,并将其动作代码相关联。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

S+叮当猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值