QT 自定義選單欄
阿新 • • 發佈:2018-11-12
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()