今天的內容主要還是繼續完善前面的那個程序。我們要為我們的程序加上一個狀態欄。
狀態欄位於主窗口的最下方,提供一個顯示工具提示等信息的地方。一般地,當窗口不是最大化的時候,狀態欄的右下角會有一個可以調節大小的控制點;當窗口最大化的時候,這個控制點會自動消失。Qt提供了一個QStatusBar類來實現狀態欄。
Qt具有一個相當成熟的GUI框架的實現——這一點感覺比Swing要強一些——Qt似乎對GUI的開發做了很多設計,比如 QMainWindow類裡面就有一個statusBar()函數,用於實現狀態欄的調用。類似menuBar()函數,如果不存在狀態欄,該函數會自動創建一個,如果已經創建則會返回這個狀態欄的指針。如果你要替換掉已經存在的狀態欄,需要使用QMainWindow的setStatusBar()函數。
在Qt裡面,狀態欄顯示的信息有三種類型:臨時信息、一般信息和永久信息。其中,臨時信息指臨時顯示的信息,比如QAction的提示等,也可以設置自己的臨時信息,比如程序啟動之後顯示Ready,一段時間後自動消失——這個功能可以使用QStatusBar的showMessage()函數來實現;一般信息可以用來顯示頁碼之類的;永久信息是不會消失的信息,比如可以在狀態欄提示用戶Caps Lock鍵被按下之類。
QStatusBar繼承自QWidget,因此它可以添加其他的QWidget。下面我們在QStatusBar上添加一個QLabel。
首先在class的聲明中添加一個私有的QLabel屬性:
private:
QAction *openAction;
QLabel *msgLabel;
然後在其構造函數中添加:
msgLabel = new QLabel;
msgLabel->setMinimumSize(msgLabel->sizeHint());
msgLabel->setAlignment(Qt::AlignHCenter);
statusBar()->addWidget(msgLabel);
這裡,第一行創建一個QLabel的對象,然後設置最小大小為其本身的建議大小——注意,這樣設置之後,這個最小大小可能是變化的——最後設置顯示規則是水平居中(HCenter)。最後一行使用statusBar()函數將這個label添加到狀態欄。編譯運行,將鼠標移動到工具條或者菜單的 QAction上,狀態欄就會有相應的提示:
看起來是不是很方便?只是,我們很快發現一個問題:當沒有任何提示時,狀態欄會有一個短短的豎線:
這是什麼呢?其實,這是QLabel的邊框。當沒有內容顯示時,QLabel只顯示出自己的一個邊框。但是,很多情況下我們並不希望有這條豎線,於是,我們對statusBar()進行如下設置:
statusBar()->setStyleSheet(QString("QStatusBar::item{border: 0px}"));
這裡先不去深究這句代碼是什麼意思,簡單來說,就是把QStatusBar的子組件的border設置為0,也就是沒有邊框。現在再編譯試試吧!那個短線消失了!
QStatusBar右下角的大小控制點可以通過setSizeGripEnabled()函數來設置是否存在,詳情參見API文檔。
好了,現在,我們的狀態欄已經初步完成了。由於QStatusBar可以添加多個QWidget,因此,我們可以構建出很復雜的狀態欄。
出處:http://devbean.blog.51cto.com/448512/210947