Qt 使用-自定义菜单栏

Qt 学习笔记

使用Qt设计及界面时,常用的两种方式添加菜单,第一使用UI界面添加,第二种 在代码中添加菜单。

本次示例,为加深学习映象,故混合使用

使用UI添加菜单

直接在菜单栏输入:

注意: 子菜单可能无法输入中文,可在Action Editor 中修改文本与提示信息

使用代码

QMenuBar --菜单栏类:菜单栏类给窗口提供水平菜单栏,此菜单栏占用窗口上方区域,垂直高度不变,水平宽度为窗口宽度,可随窗口大小变化而变化。

QMenu --菜单项,包含各个子菜单。QMenu还可以用来创建弹出菜单。

QAction --子菜单,一个子菜单对应一个操作。

源码:

如果出现以下错误

检查是否有菜单项没有初始化

如:我的pMenuTest1 没有初始化

源码:

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

    //菜单栏
    QMenuBar *pMenuBar;
    //菜单项
    QMenu *pMenuTest;

    //子菜单
    QAction *pActionTest;
    QAction *pActionTest1;

public slots:
    void openFileWindow();

private:
    Ui::MainWindow *ui;   
};
#endif // MAINWINDOW_H

mainwindow.cpp

我使用utf-8 可能存在乱码现象,使用

QStringLiteral("中文") 解决
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QFileDialog>

#define USE_DEFAULT_MENU_BAR "use_default_menu_bar"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    //指定菜单栏
#ifdef USE_DEFAULT_MENU_BAR
    //添加菜单栏(此处添加为的为QMainWindow自带的菜单)
    pMenuBar = this->menuBar();
#else
    //添加自定义菜单
    pMenuBar = new QMenuBar(this);
#endif
    //定义菜单项
    //(&n)代表快捷方式,当窗口获得焦点时按alt+n即可打开“测试”菜单项
    pMenuTest = new QMenu(QStringLiteral("构建(&D)"),this);

    //定义子菜单
    //(&s)为子菜单快捷键,当打开该菜单项后,按下‘s’键即可响应
    pActionTest = new QAction(QStringLiteral("构建所有项目(&S)"),this);
    //新建一个带图标的菜单项,图标使用资源文件中的资源
    pActionTest1 = new QAction(QIcon(":/new/prefix1/resource/soccer_ball.ico"),QStringLiteral("执行QMark"),this);
    //将菜单项添加到子菜单
    pMenuTest->addAction(pActionTest);
    pMenuTest->addAction(pActionTest1);
    //在菜单项之间添加分割线
    pMenuTest->addSeparator();

    //将子菜单添加到菜单栏
    pMenuBar->addMenu(pMenuTest);

#ifndef USE_DEFAULT_MENU_BAR
    //当不使用QMainWindow自带的菜单栏时,必须要加上此行
    setMenuBar(pMenuBar);
#endif
    //添加菜单响应函数
    connect(ui->actionOpenFileProj,SIGNAL(triggered()), this, SLOT(openFileWindow()));
    connect(pActionTest,&QAction::triggered,this,&MainWindow::openFileWindow);

}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::openFileWindow(){
     QString fileName = QFileDialog::getOpenFileName(NULL, QStringLiteral("导入bin文件"),".",QStringLiteral("文本文件(*.bin);;所有文件 (*.*)"));
}

运行效果:

点击打开项目

参考:

经验分享 程序员 微信小程序 职场和发展