【Qt】QToolBar、QToolButton的常用用法

一、QToolBar 常用用法

QToolBar 是 Qt 中用于創建工具欄的控件,可快速放置常用功能按鈕、分隔符或自定義控件,并支持拖動停靠、浮動等特性。

1. 基礎創建與添加到主窗口

// 在 QMainWindow 中創建工具欄
QToolBar *toolBar = new QToolBar(tr("主工具欄"), this);
addToolBar(toolBar); // 將工具欄添加到主窗口(默認停靠在頂部)

2. 添加動作(QAction)與控件

工具欄的核心元素是 QAction(可同時用于菜單和工具欄),也可直接添加自定義控件(如 QComboBoxQLineEdit)。

// 示例:添加“新建”“打開”動作 + 搜索框
QAction *actionNew = new QAction(tr("&New"), this);
QAction *actionOpen = new QAction(tr("&Open"), this);
toolBar->addAction(actionNew);   // 添加動作
toolBar->addAction(actionOpen);
toolBar->addSeparator();         // 添加分隔符QLineEdit *searchBox = new QLineEdit();
searchBox->setPlaceholderText("搜索...");
toolBar->addWidget(searchBox);   // 添加自定義控件

3. 停靠與浮動控制

工具欄支持拖動到窗口的上、下、左、右區域,或脫離成為浮動窗口。

toolBar->setMovable(true);       // 允許拖動(默認 true)
toolBar->setFloatable(true);     // 允許浮動(默認 true)
toolBar->setAllowedAreas(Qt::TopToolBarArea | Qt::BottomToolBarArea); // 僅允許停靠在頂部/底部

設置初始停靠位置

m_pMainToolBar = new QToolBar(tr("MainToolBar"), this); // 先new出QToolBar實例
this->addToolBar(Qt::LeftToolBarArea, m_pMainToolBar);  // 傳入默認停靠位置 Qt::LeftToolBarArea

注意:工具欄停靠位置只能在主窗口 add時進行設置,后邊無法通過編碼更改初始停靠位置。

4. 外觀定制

控制圖標大小、按鈕文本與圖標的布局、方向等。

toolBar->setIconSize(QSize(24, 24));  // 圖標大小
toolBar->setToolButtonStyle(Qt::ToolButtonTextUnderIcon); // 文本在圖標下方
toolBar->setOrientation(Qt::Vertical); // 垂直排列(默認水平)

5. 信號與交互

響應工具欄動作的觸發事件。

// 連接動作的 triggered 信號到槽函數
connect(actionOpen, &QAction::triggered, this, &MainWindow::openFile);// 連接工具欄的 actionTriggered 信號(觸發任意動作時發射)
connect(toolBar, &QToolBar::actionTriggered, this, &MainWindow::handleAction);

二、QToolButton 常用用法

QToolButton 是專為工具欄設計的按鈕控件,比 QPushButton 更緊湊,支持圖標、文本、下拉菜單、可切換狀態等特性。

1. 基礎創建與添加到工具欄

QToolButton *toolBtn = new QToolButton(this);
toolBtn->setIcon(QIcon(":/icons/save.png")); // 設置圖標
toolBtn->setText("保存");                    // 設置文本
toolBar->addWidget(toolBtn);                 // 添加到工具欄

注意:toolButtonStyle 僅作用于工具欄自動生成的按鈕(通過 addAction),手動添加的 QToolButtonaddWidget)需自行管理樣式。詳細解釋如下:

1.1 兩種添加方法的關鍵區別:樣式繼承機制

  • addAction 的按鈕:
    • 工具欄內部為每個 QAction 生成一個 QToolButton,并將 toolButtonStyle(如 Qt::ToolButtonTextUnderIcon)強制應用到這些自動生成的按鈕上。
    • 示例:
QAction* action = new QAction(QIcon("icon.png"), "按鈕", this);// 自動生成的 QToolButton 會繼承 toolBar 的 toolButtonStyle
toolBar->addAction(action);  
  • addWidget**的按鈕 :
    • 手動創建的 QToolButton(如 new QToolButton())是獨立控件,工具欄的 toolButtonStyle 不會自動作用于它。
    • 原因:這些按鈕可能已自定義樣式(如設置了專屬的圖標、文本布局),Qt 避免強制覆蓋用戶的自定義邏輯。
    • 示例:
QToolButton* btn = new QToolButton();
btn->setToolButtonStyle(Qt::ToolButtonIconOnly); // 自定義樣式
toolBar->addWidget(btn); // 工具欄的 toolButtonStyle 不會影響此按鈕 
  • 如何讓 addWidget 的按鈕繼承樣式?

    若需手動添加的按鈕(addWidget)也遵循工具欄的樣式,需手動同步屬性

// 工具欄樣式設置
toolBar->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);// 手動創建按鈕并同步樣式 QToolButton* customBtn = new QToolButton();
customBtn->setToolButtonStyle(toolBar->toolButtonStyle()); // 顯式繼承
toolBar->addWidget(customBtn); 
  • 總結:
    • 通過 addWidget()方法手動添加的QToolButton需自行管理樣式。
      • 適合快速創建統一風格的按鈕(如標準的 “新建”“保存”),減少重復代碼。
    • 不同的是,通過addAction()方法添加 QAction 動作,工具欄會自動創建 QToolButton,并綁定動作,按鈕樣式由工具欄的toolButtonStyle統一控制。
      • 適合復雜場景(如帶下拉菜單的按鈕、自定義組合控件),允許完全控制按鈕樣式。

2. 圖標與文本布局

通過 Qt::ToolButtonStyle 控制圖標和文本的顯示方式。

toolBtn->setToolButtonStyle(Qt::ToolButtonTextUnderIcon); // 文本在圖標下方
// 可選值:IconOnly(僅圖標)、TextOnly(僅文本)、TextBesideIcon(文本在圖標旁)等

3. 下拉菜單與彈出模式

QToolButton 可關聯下拉菜單,支持三種彈出模式:

QMenu *menu = new QMenu(this);
menu->addAction("保存", this, &MainWindow::save);
menu->addAction("另存為", this, &MainWindow::saveAs);toolBtn->setMenu(menu);
toolBtn->setPopupMode(QToolButton::MenuButtonPopup); // 右側顯示箭頭,點擊箭頭彈出菜單
// 其他模式:InstantPopup(點擊立即彈菜單)、DelayedPopup(長按彈菜單,默認)

4. 可切換狀態(類似復選框)

設置為“可檢查”模式后,按鈕可保持“按下/釋放”狀態。

toolBtn->setCheckable(true); // 啟用可檢查狀態
connect(toolBtn, &QToolButton::toggled, this, &MainWindow::toggleTool); // 連接切換信號

5. 自動提升與箭頭樣式

  • 自動提升:鼠標懸停時按鈕呈現 3D 凸起效果。
  • 箭頭樣式:可顯示箭頭(替代圖標)。
toolBtn->setAutoRaise(true);  // 啟用自動提升(無邊框,懸停時凸起)
toolBtn->setArrowType(Qt::DownArrow); // 顯示下箭頭(替代圖標)

6. 設置提示

toolBtn->setToolTip(tr("這是系統設置按鈕"));

鼠標停留在工具按鈕上方,會有如下效果:
在這里插入圖片描述

三、結合使用示例

QToolButtonQToolBar 配合,實現帶下拉菜單的保存按鈕:

QMainWindow window;
QToolBar *toolBar = new QToolBar(&window);
window.addToolBar(toolBar);QToolButton *saveBtn = new QToolButton(&window);
saveBtn->setIcon(QIcon(":/save.png"));
saveBtn->setText("保存");
saveBtn->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);QMenu *saveMenu = new QMenu(&window);
saveMenu->addAction("保存", &window, []() { qDebug() << "保存文件"; });
saveMenu->addAction("另存為", &window, []() { qDebug() << "另存為..."; });saveBtn->setMenu(saveMenu);
saveBtn->setPopupMode(QToolButton::MenuButtonPopup);toolBar->addWidget(saveBtn);
window.show();

四、總結

  • QToolBar:負責工具欄的整體容器管理,支持停靠、浮動、布局定制,通過 addAction()/addWidget() 填充內容。
  • QToolButton:專注于工具欄內的按鈕交互,支持圖標、文本、下拉菜單、可切換狀態等特性,是構建復雜工具欄的核心組件。

兩者結合可實現靈活、專業的工具欄界面,提升用戶操作效率。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/95634.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/95634.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/95634.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

DVWA靶場通關筆記-驗證碼繞過Insecure CAPTCHA (Impossible級別)

目錄 一、reCAPTCHA 1、配置security為Impossible級別。 2、配置RECAPTCHA參數 3、再次打開靶場 二、源碼分析 1、index.php 2、impossible.php 3、功能函數 三、reCAPTCHA 防范分析 1、嚴格的參數驗證與處理 2、預處理防止SQL注入 3、CAPTCHA 驗證通過 4、驗證當前…

MySQL安裝(如果之前有安裝過MySQL,先執行下面的卸載流程)

1.安裝MySQL 1.1更新系統的軟件包列表 sudo apt-get update1.2安裝MySQL服務器 sudo apt-get install mysql-server1.3檢查MySQL服務是否啟動&#xff0c;若沒有啟動手動啟動若沒有啟動執行&#xff1a; sudo service mysql start1.4登錄MySQL&#xff08;默認安裝之后不需要密…

Streamlit 數據看板模板:非前端選手快速搭建 Python 數據可視化交互看板的實用工具

你想想看&#xff0c;平時你用 Python 跑出來一堆數據 —— 比如用戶留存率、產品銷量變化&#xff0c;想給領導或者同事看&#xff0c;總不能直接發個 CSV 文件或者一堆靜態圖吧&#xff1f;對方看的時候還得自己翻數據&#xff0c;想對比下上個月和這個月的變化都費勁&#x…

FMC、FMC+ 詳解

文章目錄FMC 簡介FMC 引腳輸出定義High-pin count (HPC) connector, HPC pinoutLow-pin count (LPC) connector, LPC pinoutPin and signal descriptionFMC 簡介VITA57 標準更新歷史VITA57.4 標準推出的原因FMC 引腳輸出定義Altera 開發板的 FMC 引腳定義英特爾 Arria 10 GX FP…

小迪web自用筆記24

黑名單機制。如果被過濾可以試試PHP5看看過濾沒&#xff08;或者其他變種變形&#xff09;&#xff0c;但是得看環境有些環境會被當成下載&#xff0c;有些會直接打開。白名單機制只允許這幾個特定后綴可以上傳&#xff0c;比黑名單更安全。直接從信息圖中獲取文件類型。文件類…

私有部署問卷系統、考試系統、投票系統、測評系統的最佳選擇-調問開源問卷表單(DWSurvey)

在選擇私有部署問卷系統的時候&#xff0c;調問問卷系統(DWSurvey)是一定要嘗試一下&#xff0c;而且可以應用到私有部署考試系統、私有部署投票系統、私有部署測評系統等多個應用場景。 私有部署問卷、考試、測評、投票系統的優勢不言而喻&#xff0c;就拿私有部署考試系統來說…

企業實用——MySQL的備份詳解

序言: 本次基于mysql8.0.40來給大家做數據庫的備份的實用技巧和思路!對于mysql基礎的部分后續我會節選部分給大家講解,本篇文章適合有一定數據庫基礎的小伙伴看。 目錄 一、MySQL備份概述 1、關于數據保存你要知道 2、到底要備份什么 備份什么 MySQL體系結構(MySQL =…

使用 FunASR 工具包實現音頻文件的語音識別

使用 FunASR 工具包實現音頻文件的語音識別&#xff0c;并將識別結果保存為文本文件&#xff0c;支持單文件處理和批量處理。電腦環境需要配置&#xff0c;我使用的PyTorch版本: 2.4.1cu121&#xff0c;CUDA可用: True。FunASR 是一個功能強大、性能卓越、面向工業應用的語音識…

【STM32】定時器編碼器接口

【STM32】定時器編碼器接口一、編碼器接口1.1 正交編碼器1.2 編碼器接口基本結構1.3 工作模式二、編碼器接口測速一、編碼器接口 編碼器接口可接收增量&#xff08;正交&#xff09;編碼器的信號&#xff0c;根據編碼器旋轉產生的正交信號脈沖&#xff0c;自動控制CNT的自增或…

浪潮科技Java開發面試題及參考答案(120道題-中)

請介紹一下 SpringMVC 的運行流程&#xff1f;從用戶發送請求到響應返回的完整步驟是什么&#xff1f;SpringMVC 是基于MVC架構的Web框架&#xff0c;其運行流程圍繞“前端控制器&#xff08;DispatcherServlet&#xff09;”展開&#xff0c;通過多個組件協同工作&#xff0c;…

k8s初始化常見問題

執行初始化&#xff1a;kubeadm init --apiserver-advertise-address192.168.88.110 --image-repository registry.aliyuncs.com/google_containers --pod-network-cidr10.244.0.0/16 --control-plane-endpointweb01報錯信息&#xff1a;age-repository registry.aliyuncs.com/…

Python學習筆記--使用Django修改和刪除數據

一、修改方式一&#xff1a;模型類的對象.屬性 更改的屬性值&#xff0c;模型類的對象.save()返回值&#xff1a;編輯的模型類的對象。def update_book(request):book models.Book.objects.filter(pk1).first()book.price "169"book.save()return HttpResponse(bo…

如何評價2025年數學建模國賽?

2025年全國大學生數學建模競賽將于9月4日正式舉行&#xff01; 有些第一次參加數學競賽的同學可能覺得自己還沒準備好&#xff0c;臨近比賽感到緊張很正常&#xff0c;但需調整心態——數學建模比賽本就是學習過程&#xff0c;遇到不會的知識及時搜索、現學現用即可&#xff0…

uniapp [全端兼容] - 實現全景圖Vr 720°全景效果查看預覽功能,3D全景圖流暢不卡頓渲染+手勢拖拽+懸浮工具按鈕,uniAPP實現vr看720度全景效果示例代碼(H5小程序APP全兼容)

前言 如果您需要 Vue 版本,請訪問 這篇文章。 在 uni-app 全平臺兼容(H5網頁網站、支付寶/微信小程序、安卓App、蘋果App、nvue)開發中,詳細實現全景圖Vr 720全景查看+用戶可流暢拖動預覽+自定義工具欄/按鈕元素等,uniApp如何實現在線觀看720度全景圖,適用于全景圖VR看房…

51單片機-實現串口模塊教程

本章概述思維導圖&#xff1a;51單片機實現串口模塊教程通信基本概念通信&#xff0c;至少是需要兩個對象&#xff0c;一個收一個發數據。根據數據通信的傳輸時序協調方式&#xff0c;可分為&#xff1a;同步通信和異步通信&#xff1b;根據數據通信的傳輸線路可分為&#xff1…

Linux echo 命令使用說明

echo 命令使用說明&#xff08;Linux&#xff09; 適用環境 Bash/Zsh 等常見 Shell&#xff08;echo 通常為內建命令&#xff09;也可能存在外部 /bin/echo&#xff08;行為與內建略有差異&#xff09; 基本語法 echo [選項] [字符串...]常用選項 -n: 結尾不輸出換行-e: 解析反…

Java搭建高效后端,Vue打造友好前端,聯合構建電子采購管理系統,實現采購流程電子化、自動化,涵蓋采購全周期管理,功能完備,附詳細可運行源碼

前言&#xff1a;在當今數字化浪潮席卷的時代&#xff0c;企業的采購管理面臨著前所未有的挑戰與機遇。傳統采購模式因流程繁瑣、效率低下、信息不透明等問題&#xff0c;已難以滿足企業快速發展的需求。電子采購管理系統作為一種創新的采購解決方案&#xff0c;借助先進的信息…

應用開發使用緩存

在 Java 開發的典型架構&#xff08;結合前端、后端、MyBatis、MySQL 及緩存機制&#xff09;中&#xff0c;緩存層次可以從前端到后端再到數據庫進行劃分&#xff0c;通常涉及以下多層緩存&#xff1a;1. 前端緩存瀏覽器緩存&#xff1a;瀏覽器自帶的緩存機制&#xff08;如 H…

leetcode算法刷題的第二十六天

今天主要是要用貪心算法來解決重置區間的問題。 1.leetcode 452.用最少數量的箭引爆氣球 題目鏈接 class Solution { public:static bool cmp(const vector<int>& a,const vector<int>& b){return a[0]<b[0];}int findMinArrowShots(vector<vecto…

BlueZ 學習之GATT Server開發

Linux下&#xff0c;使用C語言開發一個簡單的GATT Server&#xff0c;我的Ubuntu上跑的BlueZ版本是5.79&#xff0c;使用的GLib庫版本是2.85.2&#xff0c;這里我直接使用GLib里的D?Bus來實現與BlueZ通信。BlueZ 官方推薦通過 D-Bus 進行通信和控制&#xff0c;如果是要使用原…