Qt菜單欄、工具欄、狀态欄介紹及工具欄action的動态增删顯示實作方式
版本說明
版本 | 作者 | 日期 | 備注 |
0.1 | loon | 2018.11.12 | 初稿 |
目錄
文章目錄
- Qt菜單欄、工具欄、狀态欄介紹及工具欄action的動态增删顯示實作方式
- 版本說明
- 目錄
- 一、需求和目的
- 二、菜單欄、工具欄、狀态欄
- 三、Qt菜單欄、工具欄和狀态欄的基本操作說明
- 1、QMenuBar:
- 2、QToolBar
- 3、QStatusBar
- 四、工具欄功能在菜單欄進行動态配置的實作思路
- 1、思路
- 2、結果展示
- 五、最後
一、需求和目的
基本上所有的編輯器都支援工具欄快捷功能的動态增删,即我們在菜單欄上打鈎就可以在工具欄上看到相應功能的快捷按鈕,取消打鈎則在工具欄上就移除了該功能的快捷按鈕,那麼Qt如何實作這個功能呐,我們本次總結的目的就是記錄我解決這個問題的思路和方法。
二、菜單欄、工具欄、狀态欄
對于這三個概念先做一個簡單的了解,我們直接上一個source insight的圖,來說一下什麼是菜單欄、工具欄和狀态欄:
最上面的可以下拉的菜單欄,然後是快捷點選的工具欄,最下面的是顯示某些狀态資訊的狀态欄。菜單欄的功能一般來說就是最全的,工具欄的内容可以在菜單欄中進行設定以在有限的位置顯示出我們需要的常用的一些功能的快捷點選按鈕(此外,還有快捷鍵,這裡就不展開了)。
三、Qt菜單欄、工具欄和狀态欄的基本操作說明
打開Qt助手,分别搜尋menuBar、toolBar、statusBar,找到對應的QMenuBar、QToolBar、QStatusBar的類說明進行了解。基礎的應用了解一下其方法和屬性(公有的、私有的、受保護的都了解一下)、槽、信号等,再了解一些如何使用的 較長的描述以及一些注意事項就可以很快上手了。
1、QMenuBar:
見名知意一下,使用的時候再具體去看一下,基本沒什麼問題,下面的是公有方法,還有一些其他的内容在助手上都很詳細,根據需要去了解一下即可。
函數 | 說明 |
QMenuBar(QWidget *parent = Q_NULLPTR) | |
~QMenuBar() | |
QAction *actionAt(const QPoint &pt) const | |
QRect actionGeometry(QAction *act) const | |
QAction *activeAction() const | |
QAction *addAction(const QString &text) | |
QAction *addAction(const QString &text, const QObject *receiver, const char *member) | |
QAction *addMenu(QMenu *menu) | |
QMenu *addMenu(const QString &title) | |
QMenu *addMenu(const QIcon &icon, const QString &title) | |
QAction *addSeparator() | |
void clear() | |
QWidget *cornerWidget(Qt::Corner corner = Qt::TopRightCorner) const | |
QAction *defaultAction() const | |
QAction *insertMenu(QAction *before, QMenu *menu) | |
QAction *insertSeparator(QAction *before) | |
bool isDefaultUp() const | |
bool isNativeMenuBar() const | |
void setActiveAction(QAction *act) | |
void setCornerWidget(QWidget *widget, Qt::Corner corner = Qt::TopRightCorner) | |
void setDefaultAction(QAction *act) | |
void setDefaultUp(bool ) | |
void setNativeMenuBar(bool nativeMenuBar) | |
NSMenu *toNSMenu() |
較長的描述:
QMenuBar類提供了一個水準菜單欄。
菜單欄由下拉菜單項清單組成。使用addMenu()添加菜單項。例如,假設menubar是一個指向QMenuBar的指針,fileMenu是一個指向QMenu的指針,那麼下面的語句将菜單插入到菜單欄中:
menuBar->addMenu(fileMenu);
菜單項文本中的&号設定Alt+F作為此菜單的快捷方式。(你可以使用“&&”在菜單欄中得到一個真正的&符号。)
沒有必要設定菜單欄。它自動将自己的幾何圖形設定到父小部件的頂部,并在父小部件調整大小時适當地修改它。
使用
在大多數主視窗樣式應用程式中,您将使用QMainWindow中提供的menuBar()函數,将qmenu添加到菜單欄中,并将QActions添加到彈出菜單中。
示例(來自菜單示例):
fileMenu = menuBar()->addMenu(tr(“檔案”));
fileMenu->addAction(newAct);
可以使用removeAction()方法删除菜單項。
可以使用QWidgetAction類的執行個體将小部件添加到菜單中。然後,可以按照通常的方式将這些操作插入到菜單中;有關詳細資訊,請參閱QMenu文檔。
平台依賴的外觀和感覺
不同的平台對菜單欄的外觀和使用者互動時的行為有不同的要求。例如,Windows系統經常被配置為隻在按下Alt鍵時才顯示菜單欄中顯示鍵盤快捷鍵的下劃線字元助記符。
其它還有一些在MAC和Win CE上使用的一些說明,這裡就不多說了。
2、QToolBar
較長的描述:
QToolBar類提供一個包含一組控件的可移動面闆。
使用addAction()或insertAction()通過添加操作添加工具欄按鈕。可以使用addSeparator()或insertSeparator()分隔按鈕組。如果工具欄按鈕不合适,可以使用addWidget()或insertWidget()插入小部件。合适的小部件的例子有QSpinBox、QDoubleSpinBox和QComboBox。當按下工具欄按鈕時,它會發出actiontrigger()信号。
工具欄可以固定在特定區域(例如視窗頂部),也可以在工具欄區域之間移動;請參閱setMovable()、isMovable()、allowedAreas()和isAreaAllowed()。
當工具欄的大小調整到太小而不能顯示它所包含的所有項目時,擴充按鈕将作為工具欄中的最後一個項目出現。按下擴充按鈕将彈出一個菜單,其中包含目前不在工具欄中的項目。
如果QToolBar不是QMainWindow的子視窗,它就失去了使用addWidget()在工具欄中添加小部件填充擴充彈出框的能力。請使用繼承QWidgetAction并實作QWidgetAction::createWidget()建立的小部件操作。
請參閱QToolButton、QMenu、QAction和應用程式示例。
可以看到工具欄還可以插入QSpinBox、QDoubleSpinBox和QComboBox小部件呐,感興趣的可以試試,此外,點選工具欄按鈕時發出的是actiontrigger信号。
3、QStatusBar
QStatusBar類提供了一個适合顯示狀态資訊的水準條。
每個狀态訓示器分為以下三類:
- Temporary(暫時的)-暫時占據狀态欄的大部分。例如,用于解釋工具提示文本或菜單項。
- Normal(一般的) -占據狀态欄的一部分,可能被臨時消息隐藏。例如,用于在字處理器中顯示頁和行号。
- Permanent(永久的)-永遠不會隐藏。例如,一些應用程式将大寫鎖定訓示器放在狀态欄中,用于重要的模式訓示。
QStatusBar可以顯示所有三種類型的訓示器。
通常,狀态欄功能的請求與QMainWindow對象相關。QMainWindow提供了一個主應用程式視窗,其中包含一個菜單欄、工具欄、停靠小部件和一個圍繞大型中央小部件的狀态欄。可以使用QMainWindow::statusBar()函數檢索狀态欄,并使用QMainWindow::setStatusBar()函數替換狀态欄。
使用showMessage()顯示臨時消息:
void MainWindow::createStatusBar()
{
statusBar()->showMessage(tr(“準備好”));
}
要删除臨時消息,請使用clearMessage()槽函數,或在調用showMessage()時設定時間限制。例如:
void MainWindow::print ()
{
#ifndef QT_NO_PRINTDIALOG
QTextDocument *document = textEdit->document();
QPrinter printer;
QPrintDialog dlg(&printer, this);
if (dlg.exec() != QDialog::Accepted){
return;
}
document->print(&printer);
statusBar()->showMessage(tr(“Reday”),2000);
# endif
}
使用currentMessage()函數來檢索目前顯示的臨時消息。QStatusBar類還提供了messageChanged()信号,當臨時狀态消息發生更改時發出該信号。
通過建立一個小部件(QLabel、QProgressBar甚至QToolButton),然後使用addWidget()或addPermanentWidget()函數将其添加到狀态欄中,可以顯示普通消息和永久消息。使用removeWidget()函數從狀态欄删除此類消息。
statusBar()->addWidget(new MyReadWriteIndication);
預設情況下,QStatusBar在右下角提供一個QSizeGrip。您可以使用setSizeGripEnabled()函數禁用它。使用isSizeGripEnabled()函數确定大小搖桿的目前狀态。
參見QMainWindow, QStatusTipEvent, GUI設計手冊:狀态欄和應用執行個體。
由此可以看出狀态欄一般都分成三份呐(暫時、一般、永久)。此外,還可以插入小部件别忘記用。
四、工具欄功能在菜單欄進行動态配置的實作思路
1、思路
根據上面的描述,我們可以看到一般就是用addaction和insertaction添加action的,一般我們用Qt設計師設計完後action都已經有了,是以addaction不是很好用了,我這裡是用insertaction,但是insert要指定放在哪個action前面,這就麻煩了,我們動态添加的時候不知道前一個action是什麼,是以這裡就用到了一個小技巧: 在最後設定占位action(占位的action名字設定為|即可),那麼我們insertaction時就插入到對應的占位action前面就可以了,即設定空白的action進行占位。 移除就不用多說了,直接removeaction。
使action可選的方式就是設定action為checked即可選的,然後就可以設定enabled來(true、false)顯示√了。
定義工具欄的顯示與否這裡就不說了,很簡單,使用其自帶的槽函數結合一個action按鈕就可以了。
2、結果展示
這裡主要示範工具欄的action動态增删,至于狀态欄菜單欄的擴充這裡就不示範了(圖檔大小不能超過5M哈)。