<>dialog和mainwindow

mainwindow的ui文件是默认有menubar,maintoolbar和statusbar的
dialog却没有,因此mainwindow可以直接在ui文件中进行添加,而dialog只能通过代码进行自定义菜单设置
本文主要介绍menubar和statusbar的自定义添加


mainwindow的UI界面


<>自定义menubar和statusbar

<>什么是菜单栏和状态栏

以下图界面为例,图片上方,组织,包含到库中,新建文件夹构成的部分就是菜单栏menubar,图片下方31个对象就是状态栏statusbar

菜单栏:

状态栏:


<>代码

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

* QMenuBar:窗口的菜单栏,在此基础上添加不同的QMenu和QAction
* QMenu:菜单,可以显示文本和图标,但是并不负责执行操作
* QAction: 负责执行操作的部件
* QStatusBar:负责提示的状态栏,通常在窗口最下侧
话不多说,上代码!
//dlg.h #include <QMenu> #include <QMenuBar> #include <QStatusBar> public:
QMenu* menu[10]; QAction* act[10]; QMenuBar* menuBar ; QStatusBar* statusBar;
//dlg.cpp #include <QDebug> 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()<<"新建快捷键||新建点击事件"; }

显示窗口有checkbox,可进行打勾选中

通过act的text可进行判断点击的是哪个act
例如点击了打开,会打印“打开被按下字样”,同时状态栏会出现5s的提示

如果使用Ctrl+O的快捷键是不会出现反应的,因为没有写act[1]的信号槽,而点击“新建”,trigerMenu(QAction
*act)和act_new()两个函数都会触发,先触发act_new()再触发trigerMenu(QAction
*act),但如果使用快捷键Ctrl+N,就只会触发act_new()