天天看點

PyQt學習筆記01-Qt基本概念進階篇之視窗布局,對話框  Laying Out Widgets on a Form QMainWindowEvents and signal Dialog

 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這個函數改變背景