1. 程式人生 > >QT 自定義選單欄

QT 自定義選單欄

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()
在這裡插入圖片描述