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()