在之前的《添加動作》一文中,我們已經了解了,Qt 將用戶與界面進行交互的元素抽象為一種“動作”,使用QAction
類表示。QAction
可以添加到菜單上、工具欄上。期間,我們還詳細介紹了一些細節問題,比如資源文件的使用、對象模型以及布局管理器。這一節則是詳細介紹關於菜單欄、工具欄以及狀態欄的相關內容。
我們假設窗口還是建立在QMainWindow
類之上,這會讓我們的開發簡單許多。當然,在實際開發過程中,QMainWindow
通常只作為“主窗口”,對話框窗口則更多地使用QDialog
類。我們會在后面看到,QDialog
類會缺少一些QMainWindow
類提供方便的函數,比如menuBar()
以及toolBar()
。
下面還是回到《添加動作》一文中的代碼片段:
1
2
3
4
5
6
7
8
9
10
|
openAction = new QAction(QIcon(":/images/doc-open"), tr("&Open..."), this);
openAction->setShortcuts(QKeySequence::Open);
openAction->setStatusTip(tr("Open an existing file"));
connect(openAction, &QAction::triggered, this, MainWindow::open);
QMenu *file = menuBar()->addMenu(tr("&File"));
file->addAction(openAction);
QToolBar *toolBar = addToolBar(tr("&File"));
toolBar->addAction(openAction);
|
我們看到,使用menuBar()
函數,Qt 為我們創建了一個菜單欄。menuBar()
是QMainWindow
提供的函數,因此你是不會在QWidget
或者QDialog
中找到它的。這個函數會返回窗口的菜單欄,如果沒有菜單欄則會新創建一個。這也就解釋了,為什么我們可以直接使用menuBar()
函數的返回值,畢竟我們並沒有創建一個菜單欄對象啊!原來,這就是menuBar()
為我們創建好並且返回了的。
Qt 中,表示菜單的類是QMenuBar
(你應該已經想到這個名字了)。QMenuBar
代表的是窗口最上方的一條菜單欄。我們使用其addMenu()
函數為其添加菜單。盡管我們只是提供了一個字符串作為參數,但是 Qt 為將其作為新創建的菜單的文本顯示出來。至於 & 符號,我們已經解釋過,這可以為菜單創建一個快捷鍵。當我們創建出來了菜單對象時,就可以把QAction
添加到這個菜單上面,也就是addAction()
函數的作用。
下面的QToolBar
部分非常類似。顧名思義,QToolBar
就是工具欄。我們使用的是addToolBar()
函數添加新的工具欄。為什么前面一個是menuBar()
而現在的是addToolBar()
呢?因為一個窗口只有一個菜單欄,但是卻可能有多個工具欄。如果我們將代碼修改一下:
1
2
3
4
5
|
QToolBar *toolBar = addToolBar(tr("&File"));
toolBar->addAction(openAction);
QToolBar *toolBar2 = addToolBar(tr("Tool Bar 2"));
toolBar2->addAction(openAction);
|
我們看到,現在有兩個工具欄了:
工具欄可以設置成固定的、浮動的等等,具體設置可以參考 Qt 文檔。
前面我們說過,使用QAction::setStatusTip()
可以設置該動作在狀態欄上的提示文本。但我們現在把鼠標放在按鈕上,是看不到這個提示文本的。原因很簡單,我們沒有添加一個狀態欄。怎么添加呢?類似前面的QMainWindow::menuBar()
,QMainWindow
有一個statusBar()
函數。讓我們把這個函數添加上去:
1
2
3
4
|
QToolBar *toolBar2 = addToolBar(tr("Tool Bar 2"));
toolBar2->addAction(openAction);
statusBar();
|
然后編譯運行一下:
我們添加了一個孤零零的statuBar()
顯得不倫不類,但是,同前面的menuBar()
的實現類似,這個函數會返回一個QStatusBar
對象,如果沒有則先創建再返回。
QStatusBar
繼承了QWidget
,因此,我們可以將其它任意QWidget
子類添加到狀態欄,從而實現類似 Photoshop 窗口底部那種有比例顯示、有網格開關的復雜狀態欄。有關QStatusBar
的更多信息,請參考 Qt 文檔。
對於沒有這些函數的QDialog
或者QWidget
怎么做呢?要記得,QToolBar
以及QStatusBar
都是QWidget
的子類,因此我們就可以將其結合布局管理器添加到另外的QWidget
上面。QLayout
布局提供了setMenuBar()
函數,可以方便的添加菜單欄。具體細節還是詳見文檔。
至此,我們已經將組成窗口元素介紹過一遍。結合這些元素以及布局管理,我們就應該可以實現一個簡單的通用的窗口。當我們完成窗口布局之后,我們就可以考慮向其中添加功能。這就是我們后面章節的內容。