《C++.GUI.Programming.with.Qt.4》讀書筆記Chapter 3

Chapter 3 Creating Main Windows



3.1        Subclassing 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 " 。資源本身可以是任何類型的文件。

3.2        Creating Menus and Toolbars

      Qt通過引入Action這一概念簡化了對menu和toolbar的編程。一個Action可以被添加到任意數量menu和toobar中。

      在Qt中對menu和toolbar的編程涉及到三個步驟:

      1).        創建並設置Action
      2).        創建menu,並在其中添加Action
      3).        創建toolbar,並在其中添加Action
     
      Action的創建是通過QAction類來實現的,對每個Action,可以爲其設置accelerator,parent,shortcut key, 可見性以及status tip等屬性,並可以通過調用connect()爲ACtion設置被觸發要執行的操作。

      QTableWidget的基類QAbstraceItemView提供了selectAll()這個slot。

      QApplication類提供了aboutQt()這個slot,可以通過全局變量qApp(一個類型爲QApplication *的指針)來使用之。

      在Qt中,menu由QMenu類的實例表示。而Qmenu是要被放入QMenuBar之中的。函數QMainWindow::menuBar()返回一個類型爲QMenuBar * 的指針。QMenuBar::addMenu()根據指定文本創建一個QMenu widget並將其添加進MenuBar中。QMenu::addAction() 則爲Menu添加Action。

      任意Qt Widget都可以具備相關的一系列QAction。通過調用QWidget::addAction() ,可以爲Widget添加Action。這一特性可用來創建上下文菜單。

3.3        Setting Up the Status Bar


      QMainWindow::statusBar() 返回一個指向status bar的指針;status bar 在statusBar()第一次被調用時被創建。


3.4        Implementing The Menu


      QMessageBox::Defalut修飾符使得被修飾的Button成爲默認Button,而QMessage::Escape修飾符則使得Esc鍵自動觸發被修飾的Button。
     
      QMessageBox::warning()用於彈出提示對話框。該函數屬於Qt提供的static convenicence function

static convenience function

      QFileDialog::getOpenFileName() 可用於從用戶處獲得文件名--該函數彈出一個文件選擇對話框,要求用戶選擇一個文件,並返回文件名,或者在用戶選擇" Cancel" 時返回空字符串。該函數的第一個
參數是其parent widget。對於dialog和其他widget,parent-child關係的意味是不完全相同的。一個dialog永遠是一個獨立的窗口,但是如果它擁有parent,則默認在parent之上居中顯示。
     
      當用戶發出關閉窗口的操作時,Qwidget::close() 這個slot會被調用,該slot向對應的widget發送close event。重新實現QWidget::closeEvent()能夠攔截這個event,以便確定是否真的要關閉窗口,防止誤操作。

      每個QWidget都有一個windowModified屬性,在窗口文檔被修改時應該被設爲True,否則被設爲false。

      QString::arg() 函數將字符串中編號最低的" %n" 用參數進行替換,並返回替換後的字符串。
     
      每個Action都可以擁有一個類型爲QVariant的關聯數據。
     
      Qt中的qobject_cast< T> () 機制對於動態庫也可以正常工作。



3.5        Using 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()很相似。


3.6        Storing Setting

      Qt中是通過QSettings類來將應用程序的設置信息存儲到平臺相關的位置--windows下存入註冊表中,unix中存在文本文件中。

      QSettings的構造函數包含兩個參數,分別是organization's name 和 application's name ,Qt使用這兩個參數來對應用程序的設置信息進行定位。

      QSettings以key-value pair的形式存儲信息。

3.7        Multiple Documents

      要想實現多文檔程序,首先必須要通過new在堆上創建主窗口,而不是在棧上創建主窗口。

      QAplication::closeAllWindows() 這個slot完成的操作是關閉應用程序所有的窗口,除非其中某個窗口拒絕了close event。程序員不需要擔心未保存的修改,因爲這會由QWidget::closeEvent()負責處理。

      通過在MainWindow的構造函數中調用setAttribute()函數來設置Qt::WA_DeleteOnClose屬性,可以要求Qt在窗口被關閉時將其自動銷燬。

      Qt在其可用所有平臺上都支持SDI和MDI程序的創建。


3.8     Splash Screnns

      在Qt中爲程序添加splash screen非常簡單,可通過QSplashScreen類來實現。

      通常情況下,與splash screen相關的代碼都放在main()中,
出現在調用QApplication::exec()之前。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章