Laying Out Widgets on a Form
Qt提供的的基本的Layout Manager包括:QHBoxLayout,QVBoxLayout,QGridLayout和QStackLayout。
Qt中其它能完成Layout management功能的類包括 QSplitter,QScrollArea,QMainWindow和QWorkspace。
Qt中管理child widget的layout共有三種方式:absolute positioning, manual layout和layout managers。
Absolute positioning:即由程式員通過hard-coded的形式管理child widget的位置和尺寸。
Manual Layout:child widget的位置依然由程式員通過hard-coded的方式确定,而尺寸與父視窗的大小成一定比例,而不是完全的hard-coded。這種方式通過對form的resizeEvent()進行再實作來對child widget的定位。
最重要的三個Layout Manger是QHBoxLayout,QVBoxLayout,QGridLayOut,他們都是派生自QLayout
QGridLayout的使用略微有些複雜,它工作在一個由Cell組成的二維grid上。對于QGridLayout,為其添加widget的方式如下:
layout-> addWidget(widget,row ,colum,rowSpan,columnSpan)
其中widget為待添加的child widget, row和clomun确定該widget所占據空間中左上角那個Cell的位置坐标,rowSpan和columnSpan則指定widget的大小,這兩個參數的的預設值為1。
addStretch()向Layout Manager中添加“占位符”。
每個widget都有自己的size policy,由其告知layout 系統如何處理該widget外形上的stretch或是shrink。Qt中widget的size policy是通過QSizePolicy類來表示的。每個QSizePolicy由水準和豎直兩組size policy組成,最常見的值包括:
Fixed Minimum Maximum Prefered Expanding
除了上述兩組size policy外,QSizePolicy中還存儲水準和豎直方向的stretch factor,該值用來表明在form尺寸擴充時widget随之擴充的比率。
QMainWindow
應用程式的主視窗是通過建立QMainWindow的派生類來完成的。QMainWindow和QDialog一樣,都是派生自QWidget
closeEvent()是由QWidget提供的一個虛函數,在使用者關閉視窗時會被自動調用。是以如果要确認是否真正關閉視窗,可以重載這個函數,進行判斷
setCentralWidget()将某個Widget設定為主視窗的central widget, 而central widget意味着在顯示時會占據主視窗的中央位置。
Qt下的GUI 程式設計支援多種圖形格式。可以使用多種方式為應用程式提供圖像,最常見的包括:
1). 将圖像存儲在檔案中,運作時加載之。
2). 在源碼中include XPM檔案(XPM檔案也是合法的C++檔案)。
3). 利用Qt的資源機制。
Qt的資源機制比之運作時加載更友善,并對所有支援的圖像格式都能良好工作。
為了利用Qt的資源機制,需要建立一個資源檔案,并在.pro檔案中對應添加一行來對資源檔案進行辨別。例如:
RESOURCES= spreadsheet.qrc
資源檔案本身采用了簡單的XML格式。它被編譯程序式的可執行檔案,是以不會被丢失。在對資源進行定位時,使用路徑字首" :/" ,例如“ :/images/icon.png " 。資源本身可以是任何類型的檔案。
Events and signal
在slot函數裡,可以用sender()函數知道,signal是哪個對象發送過來的。
Dialog
modeless window--one that runs independently of any other windows in the application
對于modeless dialog ,當其被彈出時,可能處于三種情況:
1). 這是該對話框第一次被激活
2). 該對話框之前曾被激活,但使用者又将其關閉
3). 該對話框之前曾被激活,而且仍可見
show() 将一個隐藏視窗變為可見,而activateWIndow()則将視窗的狀态變為active。
model window--pops up when invoked and blocks the application,preventing any other processing or interactions until it is closed.
一個dialog若是用show()來激活,則是modeless dialog;若通過exec()來激活,則是model dialog。此外,還可以調用setModel()來設定dialog的顯示模式。
QDialog::exec() 的傳回至在dialog被确認時為true,否則為false。
在棧上建立 model dialog是一種良好的程式設計慣例,因為在使用完後就不再需要,而model dialog會在作用域結束後自動被銷毀。
由于多數應用程式的About box 都是高度雷同的,Qt中提供了一個友善的static convenicence function QMessage::about(),該函數和QMessageBox::warning()很相似。
另外學習了從QDialog繼承下來的幾個類的使用,包括QInputDialog,QColorDialog,QFontDialog,QFileDialog。 其中還學習了下QFrame這個類,已經setStyleSheet這個函數改變背景