QT 自定义菜单栏

dialog和mainwindow

mainwindow的ui文件是默认有menubar,maintoolbar和statusbar的
dialog却没有,因此mainwindow可以直接在ui文件中进行添加,而dialog只能通过代码进行自定义菜单设置
本文主要介绍menubar和statusbar的自定义添加
在这里插入图片描述
QT 自定义菜单栏_第1张图片
mainwindow的UI界面
QT 自定义菜单栏_第2张图片

自定义menubar和statusbar

什么是菜单栏和状态栏

以下图界面为例,图片上方,组织,包含到库中,新建文件夹构成的部分就是菜单栏menubar,图片下方31个对象就是状态栏statusbar
QT 自定义菜单栏_第3张图片
菜单栏:
在这里插入图片描述
状态栏:
在这里插入图片描述

代码

主要涉及到4个类:QMenuBar、QMenu、QAction、QStatusBar

  • QMenuBar:窗口的菜单栏,在此基础上添加不同的QMenu和QAction
  • QMenu:菜单,可以显示文本和图标,但是并不负责执行操作
  • QAction: 负责执行操作的部件
  • QStatusBar:负责提示的状态栏,通常在窗口最下侧

话不多说,上代码!

//dlg.h
#include 
#include 
#include 
public:
    QMenu* menu[10];
    QAction* act[10];
    QMenuBar* menuBar ;
    QStatusBar* statusBar;
    
//dlg.cpp
#include 

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

    statusBar = new QStatusBar(this);
    menuBar = new QMenuBar(this);

    act[0] = new QAction("新建",this);
    act[0]->setShortcut(Qt::CTRL | Qt::Key_N );

    act[1] = new QAction("打开",this);
    act[1]->setShortcut(Qt::CTRL | Qt::Key_O );

    menu[0] = new QMenu("文件(&F)");//&F表示有Alt + F的快捷键
    menu[0]->addAction(act[0]);
    menu[0]->addAction(act[1]);
    menu[0]->addSeparator();//添加分割线
    menu[0]->addAction("查看");
    menu[0]->addAction("工具");

    menu[1] = new QMenu("编辑(&E)");
    menu[1]->addAction("剪切");//没有快捷键等特殊需求,可以跳过新建act直接这样用
    menu[1]->addAction("粘贴");

    act[2] = new QAction("显示窗口",this);
    act[2]->setCheckable(true);//设置checkbox

    menu[2] = new QMenu("窗口");
    menu[2]->addAction(act[2]);
    menu[2]->addAction("关闭窗口");

    menu[1]->addMenu(menu[2]);//添加菜单

    menuBar->setGeometry(0,0,this->width(),23);//从左上角坐标开始,设置宽度,高度;设置菜单栏位置
    menuBar->addMenu(menu[0]);
    menuBar->addMenu(menu[1]);

    connect(menuBar,SIGNAL(triggered(QAction*)),this,SLOT(trigerMenu(QAction*)));//对所有act点击事件有效,快捷键事件无效
    connect(act[0] ,SIGNAL(triggered()),this,SLOT(act_new()));//对act[0]事件(点击,快捷键)有效

    statusBar->setGeometry(2,this->height()-30,this->width(),30);//设置状态栏位置

}

//act的点击事件
void Dialog::trigerMenu(QAction *act)
{
    if(act->text() == "新建")
    {
        qDebug()<<"新建被按下";
    }
    if(act->text() == "打开")
    {
        qDebug()<<"打开被按下";
        statusBar->showMessage("不可查看当前数据",5000);//状态栏显示5s
    }
    if(act->text() == "剪切")
    {
        qDebug()<<"剪切被按下";
    }

}

//新建快捷键||新建点击事件
void Dialog::act_new()
{
    qDebug()<<"新建快捷键||新建点击事件";
}

QT 自定义菜单栏_第4张图片
显示窗口有checkbox,可进行打勾选中
QT 自定义菜单栏_第5张图片
通过act的text可进行判断点击的是哪个act
例如点击了打开,会打印“打开被按下字样”,同时状态栏会出现5s的提示
QT 自定义菜单栏_第6张图片
如果使用Ctrl+O的快捷键是不会出现反应的,因为没有写act[1]的信号槽,而点击“新建”,trigerMenu(QAction *act)和act_new()两个函数都会触发,先触发act_new()再触发trigerMenu(QAction *act),但如果使用快捷键Ctrl+N,就只会触发act_new()
在这里插入图片描述

你可能感兴趣的:(QT)