4.4 工具欄
上一節我們講了選單欄,這節我們來看看主視窗程式的工具欄QToolBar
4.4.1 QToolBar屬性

image
QToolBar繼承自QWidget。
1 allowedAreas 儲存工具欄可放置在哪個位置(相對於中心視窗)
-
Qt::LeftToolBarArea 0x1 可放置在左側
-
Qt::RightToolBarArea 0x2 右側
-
Qt::TopToolBarArea 0x4上側
-
Qt::BottomToolBarArea 0x8 下側
-
Qt::AllToolBarAreas 0xf 所有
-
Qt::NoToolBarArea 0 不能放置
這裡每個列舉的值分別為,0x1 0x2等,這表明這些列舉值可以使用或“|”運算子,即可以Qt::LeftToolBarArea|Qt::RightToolBarArea組合,表明工具欄可以被放置在左側或者右側。
在平時程式設計中如果遇到類似的情況,我們也可以使用類似的方法。
Qt::ToolBarAreas是一個QFlags<ToolBarArea>型別,當我們遇到存在“或”意義的列舉型別時,最好可以使用Q_DECLARE_FLAGS()巨集將其宣告為QFlags型別,這樣會給我們帶來很多方便。
關於QFlags的內容,小豆君會在後面的章節中具體介紹,這裡先提一下,有興趣的朋友可以搜尋相關資料。
2 floatable 是否可漂浮
如果為true,則工具欄可以用滑鼠拖拽出來,變成一個獨立的小視窗。
3 floating 是否處於漂浮狀態
如果為true,則說明工具欄已經用滑鼠拖拽出來,變成了一個獨立的小視窗。
4 iconSize 工具欄圖示大小
5 movable 是否可以被移動
這個屬性儲存工具欄是否可以被移動。
如果為false,左側的可移動標識會隱藏掉。
6 orientation 工具欄方向
-
Qt::Horizontal 水平
-
Qt::Vertical 垂直
7 toolButtonStyle 工具按鈕樣式
工具欄一般由圖示和文字組成,用於醒目的提醒使用者該按鈕的功能,這個樣式就定義了圖示和文字的配合方式。
-
Qt::ToolButtonIconOnly 只顯示圖示
-
Qt::ToolButtonTextOnly 只顯示文字
-
Qt::ToolButtonTextBesideIcon 在圖示右側顯示文字
-
Qt::ToolButtonTextUnderIcon 在圖示下方顯示文字
-
Qt::ToolButtonFollowStyle 根據StyleHint中的設定而顯示
另外,
-
可以通過addWidget,insertWidget, 新增自定義的視窗。
-
可以使用addSeparator,insertSeparator新增間隔線,從而分組。
4.4.2 示例
新建MainWindowToolBar專案,類名MainWindowToolBar,繼承自QMainWindow。
編寫如下的ui介面

image
1)新建一個選單欄File,並在選單中新增Action1,Action2
2)將這兩個動作按鈕拖拽到工具欄中。
3)在中心視窗中分別新增兩個checkbox,兩個QListWidget,並置於網格佈局中。
4)雙擊左側的listWidget,新增條目,並在右側的屬性框選擇。

image
mainwindowtoolbar.h
#ifndef MAINWINDOWTOOLBAR_H #define MAINWINDOWTOOLBAR_H #include <QMainWindow> namespace Ui { class MainWindowToolBar; } class QListWidgetItem; class MainWindowToolBar : public QMainWindow { Q_OBJECT public: explicit MainWindowToolBar(QWidget *parent = 0); ~MainWindowToolBar(); private slots: //放置區域槽函式 void on_listWidget_area_itemChanged(QListWidgetItem *item); //工具欄圖示樣式槽函式 void onBtnStyleChanged(QListWidgetItem *item); void on_check_floatable_toggled(bool checked); void on_check_movable_toggled(bool checked); private: Ui::MainWindowToolBar *ui; }; #endif // MAINWINDOWTOOLBAR_H
mainwindowtoolbar.cpp
#include <QDebug> #include "mainwindowtoolbar.h" #include "ui_mainwindowtoolbar.h" MainWindowToolBar::MainWindowToolBar(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindowToolBar) { ui->setupUi(this); QIcon icon(":/image/qq.png"); ui->actionAction1->setIcon(icon); ui->mainToolBar->setIconSize(QSize(30, 30)); connect(ui->listWidget_button, SIGNAL(itemChanged(QListWidgetItem*)), this, SLOT(onBtnStyleChanged(QListWidgetItem *))); } MainWindowToolBar::~MainWindowToolBar() { delete ui; } void MainWindowToolBar::on_listWidget_area_itemChanged(QListWidgetItem *item) { //獲取該item所代表的位置flag int row = ui->listWidget_area->row(item); int flg = Qt::LeftToolBarArea << row; //獲取工具欄原來的位置flag Qt::ToolBarAreas areas = ui->mainToolBar->allowedAreas(); //areas為QFlags<Qt::ToolBarArea>型別,所以只需將該位置開啟或關閉即可 areas.setFlag((Qt::ToolBarArea)flg, item->checkState() == Qt::Checked); //設定新flags ui->mainToolBar->setAllowedAreas(areas); } void MainWindowToolBar::onBtnStyleChanged(QListWidgetItem *item) { //這裡是為了獲取單選效果 disconnect(ui->listWidget_button, SIGNAL(itemChanged(QListWidgetItem*)), this, SLOT(onBtnStyleChanged(QListWidgetItem *))); static QListWidgetItem* lastItem = ui->listWidget_button->item(0); if (lastItem != item && item->checkState() == Qt::Checked) { int row = ui->listWidget_button->row(item); ui->mainToolBar->setToolButtonStyle((Qt::ToolButtonStyle)row); lastItem->setCheckState(Qt::Unchecked); lastItem = item; } else { item->setCheckState(Qt::Checked); } connect(ui->listWidget_button, SIGNAL(itemChanged(QListWidgetItem*)), this, SLOT(onBtnStyleChanged(QListWidgetItem *))); } void MainWindowToolBar::on_check_floatable_toggled(bool checked) { ui->mainToolBar->setFloatable(checked); } void MainWindowToolBar::on_check_movable_toggled(bool checked) { ui->mainToolBar->setMovable(checked); }
編譯執行程式,嘗試著改變屬性,看看都有哪些變化。

image
好了,關於工具欄的分享就到這裡了,我們下節再見。