當前位置:編程學習大全網 - 編程語言 - QT MainWindow和Dialog的區別和選擇

QT MainWindow和Dialog的區別和選擇

Qt中的每個類,都有壹個對應的同名頭文件,其中包含其類定義。例如要使用QApplication類,則需要在程序中添加" #include <QApplication>"

QApplication類用於管理應用程序範圍內的資源。其構造函數需要main函數的argc和argv作為參數。

widget被創建時都是不可見的(always created hidden)。widget中可容納其它widget。 Qt中的widget在有用戶行為或狀態改變時會emit signal。 signal可以和slot函數連接在壹起(connect),這樣當有signal被emit時,對應的slot函數會被自動調用。

QWidget類的構造函數需要壹個 QWidget * 指針作為參數,表示其parent widget(默認值為0,即不存在parent widget)。在parent widget被刪除時,Qt會自動刪除其所有的child widget。

Qt中有三種Layout Manager 類: QHBoxLayout,QVBoxLayOut,QGridLayOut。基本模式是將widget添加進LayOut,由Layout自動接管widget的尺寸和位置。

啟動Qt程序時可以通過 -style 參數改變程序的默認顯式風格。 Chapter 2 Creating Dialogs 2.1 Subclassing Dialog

Qt中所有dialog的基類是QDialog。QDialog派生自QWidget。

Qt中所有定義了signal或slot的類,在其類定義的開始處都要使用Q_OBJECT宏。Qt中的signal關鍵字實際上是宏定義。類似的,slots關鍵字也是宏定義。

Qt所提供的類分為若幹模塊:QtGui,QtNetWork,QtOpenGL,QtSql, QtSvg和QtXml等。 QObject::tr() 函數將輸入的字符串轉換為其他語言(國際化)。對所有用戶可見的字符串都使用tr()函數是壹個良好的習慣。

Buddy:兩個widget A和B,若A擁有快捷鍵,當用戶按下該快捷鍵時,程序的輸入焦點自動轉移到B上,則稱B是A的buddy。

QWidget::close() 是壹個slot,其默認行為是使對應的widget隱藏不可見,但並不刪除該widget。 Layout 中可包含widget和其他layout。通過嵌套使用QHBoxLayOut、QVBoxLayOut、

QGridLayOut,可以構造非常復雜的dialog。值得註意的是:layout manager 類並不屬於widget。實際上,它派生自QLayout,而QLayout又派生自QObject。

QWidget::sizeHint() 返回壹個widget()的理想大小(ideal size)。 emit關鍵字是Qt特有的,用於產生signal。

wk_ad_begin({pid : 21});wk_ad_after(21, function(){$('.ad-hidden').hide();}, function(){$('.ad-hidden').show();});

MOC(Meta-Object-Compiler): 對於所有使用了Q_OBJECT宏的類,在編譯時都需要通過MOC的處理,否則會出現鏈接錯誤。解決該錯誤的辦法也很簡單,重新執行qmake以更新makefile,然後重新編譯。

2.2 Signal and Slot in Depth Signal & Slot 機制是Qt的根基。

Slot和普通的C++類成員函數幾乎完全壹致;可以是virtual的,可以被重載,可以是public、protected或private的,而且也可所以被其他成員函數直接調用。

signal與slot之間的關聯可以是壹對壹、壹對多或多對壹。

signal和signal之間也可以被關聯,此種情況與signal-slot的區別在於,當第壹個sigal被emit時,第二個signal也被emit。

可以調用disconnect()來解除signal 與slot之間的關聯,通常情況下很少需要顯式調用disconnect(),因為對象被刪除時Qt會自動移除與其相關的關聯。

sigal-slot或signal-signal這樣的關聯,要求二者具備相同的參數列表;若signal比slot中的參數多,多余的參數會被忽略。

思維定勢:signal-slot機制只能用於widget。實際上signal-slot機制是由QObject實現的,並不僅局限於GUI編程,可以用於任何QObject子類。

2.3 Rapid Dialog Design

使用Qt Designer創建的form最終被轉換為C++代碼。

qmake工具能夠檢測到interface file(*.ui files),並調用uic,即Qt的user interface compiler。uic將.ui文件轉換為C++代碼,並存放在形式為ui_xxx.h的文件中。該文件中給出了dialog對應類的完整定義,並包含壹個 setupUi()成員函數,用於初始化form。

註意,由uic創建的這個類未派生自任何Qt class。

Qt的 parent-child機制是由QObject實現的。當創建壹個對象時若指定了parent,則parent將該對象添加至其 childern list。當parent被刪除時,Qt會遍歷其childern list並刪除每個child,該過程會遞歸進行。這壹機制極大的簡化了內存管理,降低了內存泄露的風險——程序員只需顯式的刪除通過new創建並且沒有parent的對象。

對於widget,parent還有壹層附加的意義:chidl widget 是顯示在parent widget的範圍之內的。如果刪除parent widget,不僅child widget從內存中被釋放,在屏幕上也會消失。

QDialog::accept() 將dialog的返回值設為QDialog::Accepted(值為1),而QDialog::reject()將返回值設為QDIalog::Rejected(值為0)。

2.5 Dynamic Dialogs

Dynamic Dialog指的是程序在運行時根據.ui文件創建的dialog。這樣的dialog不是通過uic將.ui轉換為C++代碼,而是在運行時使用QUiLoader類裝載.ui文件。

可以使用QObject::findChild<T> ()來訪問form的child widget。

要使用QUiLoader,需要在Qt程序的.pro文件中添加以下內容: CONFIG += uitools Dynamic dialog允許在不重新編譯程序的前提下更改form的布局。 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 *的指針)來使用之。

  • 上一篇:新宇集團有限公司呢?
  • 下一篇:河北教師編招聘考試什麽時候開始報名?
  • copyright 2024編程學習大全網