Qt应用开发(基础篇)——菜单栏 QMenuBar

一、前言

        QMenuBar类继承于QWidget,该类提供了一个水平菜单栏

菜单栏使用

        QMenuBar菜单栏,顾名思义是菜单QMenu和动作QAction的容器,一般在软件的顶部经常会见到它。菜单栏包含了一系列下拉的菜单,使用addMenu()函数添加QMenu菜单,使用addAction()函数添加QAction动作。菜单栏不需要布局,它会自动将自己的几何图形设置到父类控件的顶部,并在父类控件调整大小同步调整自身。

        创建主窗口QMainWindows样式的程序中,它自带了菜单栏,使用menuBar()可以得到菜单栏QMenuBar指针,然后你就可以直接添加QMenu或者QAction,例如:

QAction *newAct = new QAction("copy");
QMenu *fileMenu = menuBar()->addMenu(tr("&File"));
fileMenu->addAction(newAct);

        而QMenu对与文本、图标、小部件和操作action的应用,请参考我另一篇文章,这里就不多介绍了。

        菜单 QMenu

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

    QMenu *menu = new QMenu();                
    QAction *copyAcy =     menu->addAction(QIcon(QApplication::style()->standardIcon(QStyle::SP_DirOpenIcon)),"copy",this,SLOT(onCopyTriggered()),QKeySequence(Qt::CTRL + Qt::Key_C));
    menu->addAction("cut");
    menu->addSeparator();
    QMenu *sub_menu = new QMenu("help");
    menu->addMenu(sub_menu);
    menu->addMenu(sub_menu);
    sub_menu->addAction("about");
    connect(menu,&QMenu::triggered,[=](QAction *action *action){
        if(action == copyAcy)
        {
            qDebug()<<"copy Triggered";
        }
    });
    this->menuBar()->addMenu(menu);
    this->menuBar()->addMenu("编辑(E)");
}
 
void MainWindow::onCopyTriggered()
{
    qDebug()<<"copy Triggered";
}

 

二、QMenuBar类

1、defaultUp

        该属性表示弹窗的方向,默认弹窗是水平向下,如果该属性设置为true,那么弹窗方向将会变成向上弹出。一般只有菜单栏在底下,才会设置该属性。

bool isDefaultUp() const
void setDefaultUp(bool)

2、nativeMenuBar

        该属性表示菜单栏是否会在支持它的平台上作为原生菜单栏使用。如果此属性为true,则该菜单栏将在本地菜单栏中使用,而不是在其父窗口中。如果为false,则菜单栏保留在窗口中。目前只有在macOS上生效,如果没有这类系统的需求,就不需要关注了。

bool isNativeMenuBar() const
void setNativeMenuBar(bool nativeMenuBar)

3、公共函数

1)actionAt

        返回参数pt位置的的操作action指针,如果不存在或者是分隔符,则返回空指针。

QAction *actionAt(const QPoint &pt) const
2)actionGeometry

        返回参数action的矩形QRect。

QRect actionGeometry(QAction *act) const

        在上面的示例中我们添加如下代码,这样我们就可以得到某action的触发范围,得到这些信息可以和actionAt()配合使用。

this->menuBar()->addMenu("编辑(E)");
QAction *testAct = this->menuBar()->addAction("调试(D)");
qDebug()<<this->menuBar()->actionGeometry(testAct).x()
        <<this->menuBar()->actionGeometry(testAct).y()
        <<this->menuBar()->actionGeometry(testAct).width()
        <<this->menuBar()->actionGeometry(testAct).height();
3)addAction

        添加一个动作action,可以直接指定动作触发的时候接收的槽函数,参考上例。

QAction *addAction(const QString &text)
QAction *addAction(const QString &text, const QObject *receiver, const char *member)
QAction *addAction(const QString &text, const Obj *receiver, PointerToMemberFunctionOrFunctor method)
QAction *addAction(const QString &text, Functor functor)
4)addMenu

        添加一个菜单menu。

QAction *addMenu(QMenu *menu)
QMenu *addMenu(const QString &title)
QMenu *addMenu(const QIcon &icon, const QString &title)
5)insertMenu

        在某个动作action之前插入一个菜单menu。

QAction *insertMenu(QAction *before, QMenu *menu)
 6)insertSeparator

        在某个动作action之前插入一个分隔符。

QAction *insertSeparator(QAction *before)
7)addSeparator

        添加一个分隔符。

 QAction *addSeparator()
8)clear

         清除全部的菜单menu和动作action。

void clear()
9)cornerWidget

        返回位于第一个菜单项左侧或最后一个菜单项右侧的小部件,具体取决于角落。

QWidget *cornerWidget(Qt::Corner corner = Qt::TopRightCorner) const
10)cornerWidget

       将小部件设置为直接显示在第一个菜单项的左侧,或显示在最后一个菜单项的右侧

void setCornerWidget(QWidget *widget, Qt::Corner corner = Qt::TopRightCorner)

        在上面的示例中添加一个toolbutton作为角落小部件:

QToolButton *btn = new QToolButton();
btn->setIcon(QIcon(QApplication::style()->standardIcon(QStyle::SP_TitleBarMenuButton)));
this->menuBar()->setCornerWidget(btn,Qt::TopLeftCorner);

11)setActiveAction

       设置某一个动作action为激活状态。

void setActiveAction(QAction *act)

4、信号

1)hovered

        这个信号在菜单操作被高亮显示时触发,action是导致事件被发送的动作,通常用于更新状态信息。

void hovered(QAction *action)
2)hovered

        当鼠标点击触发属于该菜单栏的菜单中的动作时,触发该信号,action是引起信号触发的动作。

注意:QMenuBar必须拥有QMenu的所有权才能使此信号工作。

void triggered(QAction *action)
  • 4
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Qt中,您可以通过使用QMenuBar组件来创建菜单栏,并且可以通过设置QAction对象的快捷键属性来实现菜单栏的跳转功能。具体步骤如下: 1. 创建一个QMenuBar对象,并将其添加到您的主窗口中。 2. 在QMenuBar中添加QMenu对象,每个QMenu对象代表一个菜单项。 3. 在每个QMenu中添加QAction对象,每个QAction对象代表一个菜单栏选项。 4. 为每个QAction对象设置快捷键属性,以便用户可以通过按下快捷键来快速跳转到相应的菜单项。 下面是一个简单的示例代码,用于实现一个带有三个菜单项的菜单栏,并且可以通过按下Alt+1、Alt+2、Alt+3来快速跳转到相应的菜单项: ```cpp QMenuBar *menuBar = new QMenuBar(this); QMenu *menu1 = new QMenu("菜单1", menuBar); QMenu *menu2 = new QMenu("菜单2", menuBar); QMenu *menu3 = new QMenu("菜单3", menuBar); menuBar->addMenu(menu1); menuBar->addMenu(menu2); menuBar->addMenu(menu3); QAction *action1 = new QAction("选项1", this); QAction *action2 = new QAction("选项2", this); QAction *action3 = new QAction("选项3", this); menu1->addAction(action1); menu2->addAction(action2); menu3->addAction(action3); action1->setShortcut(QKeySequence(Qt::AltModifier + Qt::Key_1)); action2->setShortcut(QKeySequence(Qt::AltModifier + Qt::Key_2)); action3->setShortcut(QKeySequence(Qt::AltModifier + Qt::Key_3)); connect(action1, SIGNAL(triggered()), this, SLOT(onAction1Triggered())); connect(action2, SIGNAL(triggered()), this, SLOT(onAction2Triggered())); connect(action3, SIGNAL(triggered()), this, SLOT(onAction3Triggered())); ``` 在这个示例中,我们首先创建了一个QMenuBar对象,并将其添加到主窗口中。接着,我们创建了三个QMenu对象,并将其添加到QMenuBar中。然后,我们分别在每个QMenu中添加了一个QAction对象,表示菜单项。最后,我们为每个QAction对象设置了快捷键属性,并且将其与自定义的槽函数连接起来,以便在用户按下快捷键时执行相应的操作。 您可以根据需要修改这个示例代码,以便实现您所需要的菜单栏跳转功能。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

波塞冬~

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

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

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

打赏作者

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

抵扣说明:

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

余额充值