C/C++ Qt ToolBar菜單組件的具體使用
ToolBar工具欄在所有窗體應用程序中都廣泛被使用,使用ToolBar可以很好的規范菜單功能分類,用戶可根據菜單欄來選擇不同的功能,Qt中默認自帶ToolBar組件,當我們以默認方式創建窗體時,ToolBar就被加入到瞭窗體中,一般是以QToolBar的方式存在於對象菜單欄,如下所示。
QToolBar組件在開發中我遇到瞭以下這些功能,基本上可以應對大部分開發需求瞭,這裡就做一個總結。
頂部工具欄ToolBar
組件的定義有多種方式,我們可以直接通過代碼生成,也可以使用圖形界面UI拖拽實現,但使用代碼時間則更加靈活一些,ToolBar組件可以表現出多種形態.
首先來看一個簡單的生成案例,如下代碼中我們通過屬性setAllowedAreas()
可以實現將ToolBar組件放置到上下左右四個不同的方位上面.
#include "mainwindow.h" #include "ui_mainwindow.h" #include <iostream> #include <QMenuBar> #include <QToolBar> MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow) { ui->setupUi(this); // ---------------------------------------------------------- // 創建菜單欄 QMenuBar *bar = menuBar(); this->setMenuBar(bar); // 將菜單欄放入主窗口 QMenu * fileMenu = bar->addMenu("文件"); // 創建父節點 // 添加子菜單 QAction *newAction = fileMenu->addAction("新建文件"); // 設置名字 //newAction->setIcon(QIcon("://image/1.ico")); // 設置可用圖標 fileMenu->addSeparator(); // 添加分割線 QAction *openAction = fileMenu->addAction("打開文件"); // 設置名字 //openAction->setIcon(QIcon("://image/2.ico")); // 設置可用圖標 // ---------------------------------------------------------- //創建工具欄 QToolBar *toolBar = new QToolBar(this); // 創建工具欄 addToolBar(Qt::LeftToolBarArea,toolBar); // 設置默認停靠范圍 [默認停靠左側] toolBar->setAllowedAreas(Qt::TopToolBarArea |Qt::BottomToolBarArea); // 允許上下拖動 toolBar->setAllowedAreas(Qt::LeftToolBarArea |Qt::RightToolBarArea); // 允許左右拖動 toolBar->setFloatable(false); // 設置是否浮動 toolBar->setMovable(false); // 設置工具欄不允許移動 // 工具欄添加菜單項 toolBar->addAction(newAction); toolBar->addSeparator(); toolBar->addAction(openAction); // By : LyShark // https://www.cnblogs.com/lyshark // ---------------------------------------------------------- // 綁定槽函數 connect(newAction,&QAction::triggered,this,[=](){ std::cout << "new action" << std::endl; }); connect(openAction,&QAction::triggered,this,[=](){ std::cout << "open action" << std::endl; }); } MainWindow::~MainWindow() { delete ui; }
接著通過代碼的方式實現一個頂部菜單欄,該菜單欄中可以通過SetIcon(QIcon("://image/1.ico"));
指定圖標,也可以使用setShortcut(Qt::CTRL | Qt::Key_C);
為其指定特殊的快捷鍵。
#include "mainwindow.h" #include "ui_mainwindow.h" #include <iostream> #include <QMenuBar> #include <QToolBar> MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow) { ui->setupUi(this); // ---------------------------------------------------------- // 創建菜單欄 QMenuBar *bar = menuBar(); this->setMenuBar(bar); //將菜單欄放入主窗口 QMenu * fileMenu = bar->addMenu("文件"); // By : LyShark // https://www.cnblogs.com/lyshark // 添加子菜單 QAction *newAction = fileMenu->addAction("新建文件"); // 添加名字 newAction->setIcon(QIcon(":/image/1.ico")); // 設置ICO圖標 newAction->setShortcut(Qt::CTRL | Qt::Key_A); // 設置快捷鍵ctrl+a fileMenu->addSeparator(); // 添加分割線 QAction *openAction = fileMenu->addAction("打開文件"); openAction->setIcon(QIcon(":/image/2.ico")); openAction->setShortcut(Qt::CTRL | Qt::Key_C); // 設置快捷鍵ctrl+c // ---------------------------------------------------------- // 創建工具欄(可屏蔽掉,屏蔽掉後底部將失去控件欄位) QToolBar *toolBar = new QToolBar(this); // 創建工具欄 addToolBar(Qt::BottomToolBarArea,toolBar); // 設置默認停靠范圍(停靠在底部) toolBar->setFloatable(false); // 設置是否浮動為假 toolBar->setMovable(false); // 設置工具欄不允許移動 // 工具欄添加菜單項 toolBar->addAction(newAction); // 工具欄添加[新建文件] toolBar->addSeparator(); // 添加分割線 toolBar->addAction(openAction); // 添加[打開文件] // ---------------------------------------------------------- // 綁定信號和槽 connect(newAction,&QAction::triggered,this,[=](){ std::cout << "new file slot" << std::endl; }); connect(openAction,&QAction::triggered,this,[=](){ std::cout << "open file slot" << std::endl; }); } MainWindow::~MainWindow() { delete ui; }
實現頂部菜單欄二級菜單,二級頂部菜單與一級菜單完全一致,隻是在一級菜單的基礎上進行瞭延申,如下代碼則是定義瞭一個二級菜單。
#include "mainwindow.h" #include "ui_mainwindow.h" #include <iostream> #include <QMenuBar> #include <QToolBar> MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow) { ui->setupUi(this); // ---------------------------------------------------------- // 多層菜單導航欄 QMenuBar *MainMenu = new QMenuBar(this); this->setMenuBar(MainMenu); // 1.定義父級菜單 QMenu *EditMenu = MainMenu->addMenu("編輯"); // 1.1 定義 EditMemu 下面的子菜單 QAction *text = new QAction(EditMenu); text->setText("編輯文件"); // 設置文本內容 text->setShortcut(Qt::CTRL | Qt::Key_A); // 設置快捷鍵ctrl+a text->setIcon(QIcon(":/image/1.ico")); // 增加圖標 EditMenu->addAction(text); EditMenu->addSeparator(); // 在配置模式與編輯文件之間增加虛線 QAction *option = new QAction(EditMenu); option->setText("配置模式"); option->setIcon(QIcon(":/image/2.ico")); EditMenu->addAction(option); // 1.1.2 定義Option配置模式下的子菜單 QMenu *childMenu = new QMenu(); QAction *set_file = new QAction(childMenu); set_file->setText("設置文件內容"); set_file->setIcon(QIcon(":/image/3.ico")); childMenu->addAction(set_file); QAction *read_file = new QAction(childMenu); read_file->setText("讀取文件內容"); read_file->setIcon(QIcon(":/image/2.ico")); childMenu->addAction(read_file); // ---------------------------------------------------------- // 註冊菜單到窗體中 // By : LyShark // https://www.cnblogs.com/lyshark // 首先將childMenu註冊到option中 option->setMenu(childMenu); // 然後再將childMenu加入到EditMenu中 EditMenu->addMenu(childMenu); // ---------------------------------------------------------- // 綁定信號和槽 connect(text,&QAction::triggered,this,[=](){ std::cout << "edit file slot" << std::endl; }); connect(set_file,&QAction::triggered,this,[=](){ std::cout << "set file slot" << std::endl; }); connect(read_file,&QAction::triggered,this,[=](){ std::cout << "read file slot" << std::endl; }); } MainWindow::~MainWindow() { delete ui; }
Qt中的菜單還可以實現任意位置的彈出,例如我們可以將右擊customContextMenuRequested()
事件,綁定到主窗口中,實現在窗體任意位置右擊都可以彈出菜單欄,代碼如下。
#include "mainwindow.h" #include "ui_mainwindow.h" #include <QMenuBar> #include <iostream> MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow) { ui->setupUi(this); this->setContextMenuPolicy(Qt::CustomContextMenu); } MainWindow::~MainWindow() { delete ui; } // 在主界面右擊->轉到customContextMenuRequested槽 // By : LyShark // https://www.cnblogs.com/lyshark void MainWindow::on_MainWindow_customContextMenuRequested(const QPoint &pos) { // 創建菜單對象 QMenu *pMenu = new QMenu(this); QAction *pNewTask = new QAction(tr("新建"), this); QAction *pEditTask = new QAction(tr("編輯"), this); QAction *pDeleteTask = new QAction(tr("刪除"), this); // 設置屬性值編號: 1=>新建 2=>設置 3=>刪除 pNewTask->setData(1); pEditTask->setData(2); pDeleteTask ->setData(3); // 把QAction對象添加到菜單上 pMenu->addAction(pNewTask); pMenu->addAction(pEditTask); pMenu->addAction(pDeleteTask); // 增加圖標 pNewTask->setIcon(QIcon(":/image/1.ico")); pEditTask->setIcon(QIcon(":/image/2.ico")); pDeleteTask->setIcon(QIcon(":/image/3.ico")); // 連接鼠標右鍵點擊信號 connect(pNewTask, SIGNAL(triggered()), this, SLOT(onTaskBoxContextMenuEvent())); connect(pEditTask, SIGNAL(triggered()), this, SLOT(onTaskBoxContextMenuEvent())); connect(pDeleteTask, SIGNAL(triggered()), SLOT(onTaskBoxContextMenuEvent())); // 在鼠標右鍵點擊的地方顯示菜單 pMenu->exec(QCursor::pos()); //釋放內存 QList<QAction*> list = pMenu->actions(); foreach (QAction* pAction, list) delete pAction; delete pMenu; } // 處理發送過來的信號 void MainWindow::onTaskBoxContextMenuEvent() { // this->sender()就是信號發送者 QAction QAction *pEven = qobject_cast<QAction *>(this->sender()); // 獲取編號: 1=>新建 2=>設置 3=>刪除 int iType = pEven->data().toInt(); switch (iType) { case 1: std::cout << "新建任務" << std::endl; break; case 2: std::cout << "設置任務" << std::endl; break; case 3: std::cout << "刪除任務" << std::endl; break; default: break; } }
還可以將頂部的菜單通過bar->setVisible(false);
屬性將其隱藏起來,對外隻展示出一個ToolBar控件欄位,ToolBar控件欄中隻保留ICO圖標與底部文字描述,這樣能顯得更加清爽一些。
#include "mainwindow.h" #include "ui_mainwindow.h" #include <QMenuBar> #include <QToolBar> #include <iostream> MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow) { ui->setupUi(this); // ---------------------------------------------------------- // 隱藏菜單欄上的右擊菜單 this->setContextMenuPolicy(Qt::NoContextMenu); // 創建基礎頂部菜單並讓其隱藏 QMenuBar *bar = menuBar(); this->setMenuBar(bar); QMenu * fileMenu = bar->addMenu("Ptr"); bar->setVisible(false); // 隱藏菜單 // 添加子菜單 QAction *NewAction = fileMenu->addAction("新建文件"); QAction *OpenAction = fileMenu->addAction("打開文件"); QAction *ReadAction = fileMenu->addAction("讀入文件"); // 分別設置圖標 NewAction->setIcon(QIcon(":/image/1.ico")); OpenAction->setIcon(QIcon(":/image/2.ico")); ReadAction->setIcon(QIcon(":/image/3.ico")); // 創建工具欄 QToolBar *toolBar = new QToolBar(this); addToolBar(Qt::TopToolBarArea,toolBar); // 將菜單項依次添加到工具欄 toolBar->addAction(NewAction); toolBar->addAction(OpenAction); toolBar->addAction(ReadAction); // 設置禁止移動屬性,工具欄默認貼在上方 toolBar->setFloatable(false); toolBar->setMovable(false); toolBar->setToolButtonStyle(Qt::ToolButtonTextUnderIcon); // ---------------------------------------------------------- // 綁定槽函數 // By : LyShark // https://www.cnblogs.com/lyshark connect(NewAction,&QAction::triggered,this,[=](){ std::cout << "new action" << std::endl; }); connect(OpenAction,&QAction::triggered,this,[=](){ std::cout << "open action" << std::endl; }); connect(ReadAction,&QAction::triggered,this,[=](){ std::cout << "read action" << std::endl; }); } MainWindow::~MainWindow() { delete ui; }
到此這篇關於C/C++ Qt ToolBar菜單組件應用的的文章就介紹到這瞭,更多相關Qt ToolBar內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- C/C++ Qt TreeWidget 單層樹形組件應用小結
- C/C++ Qt MdiArea 多窗體組件應用教程
- PyQt QMainWindow的使用示例
- C/C++ Qt TreeWidget 嵌套節點操作使用
- Qt5實現文本編輯器(附詳細代碼)