Qt3升至Qt4須要注意的幾件事項淺談

Qt3升至Qt4須要注意的幾件事項淺談html

 

公司之前的項目是用Qt3寫的,隨着時間的推移慢慢顯示出Qt3有多方面的限制,所以先公司決定用Qt4來改寫這個項目,併爲軟件添加新功能,在此背景先編寫此文章。c++

先扯一下沒用的:gotfocus是得到焦點時觸發,Lostfocus是失去焦點的時候觸發。好比:新建兩個文本框,當點擊第一個文本框的時候,則觸發第一個文本框的getfocus事件,表示第一個文本框得到了焦點,能夠進行操做了。而後鼠標點擊第二個文本框的時候,第一個文本框首先觸發lostfocus事件,標明它已經失去焦點,沒法進行操做。同時第二個文本框得到焦點,容許輸入數據進行操做。程序員

下面進入正題:sql


1、簡介數據庫

Qt是一個跨平臺的C++應用程序開發框架。普遍用於開發GUI程序,也可用於開發非GUI程序,好比控制檯工具和服務器。編程

Qt使用標準的C++。經過語言綁定,其餘的編程語言也可使用Qt數組

Qt開放源代碼,而且提供自由軟件的用戶協議。使得它能夠被普遍地應用在各平臺上的開放源代碼軟件開發中。Qt提供三種受權方式。三種受權方式的功能、性能都沒有區別,僅在於受權協議的不一樣。LGPLGPL是免費發佈,商業版則需收取受權費。安全

Qt商業版 - Qt商業受權適用於開發專屬和/或商業軟件。此版本適用於不但願與他人共享源代碼,或者遵循GNU寬通用公共許可證(LGPL2.1版或GNU GPL 3.0版條款的開發人員。提供了技術支持服務。能夠任意的修改Qt的源代碼,而不須要公開。服務器

GNU LGPL v. 2.1- Qt 4.5.0及之後的版本開始遵循GNU LGPLLGPL容許鏈結到它的軟件使用任意的許可證,能夠被專屬軟件做爲類庫引用、發佈和銷售。能夠購買支持服務。網絡

GNU GPL v. 3.0 - 若是您但願將Qt應用程序與受GNU通用公共許可證(GPL3.0版本條款限制的軟件一同使用,或者您但願Qt應用程序遵循該GNU許可證版本的條款,則此版本Qt適用於開發此類Qt應用程序。能夠購買支持服務。

Qt使用於OPIESkypeVLC media playerAdobe Photoshop ElementsVirtualBox 與 Mathematica以及被Autodesk、歐洲空間局、夢工廠、GoogleHPKDE、盧卡斯影業、西門子公司、富豪集團華特迪士尼動畫製做公司、三星集團、飛利浦、Panasonic等所使用。

 

1. Qt4 版本簡史:

   4.0 2005.06.28  支持 X11/Windows/Mac OS X/Embedded Linux

   4.1 2005.12.19  增長QtUiToolsQtTestQtSvg模塊 

   4.2 2006.10.04  QGraphicsView取代QCanvas

   4.3 2007.05.30  增長QtScript

   4.4 2008.05.06  增長PhononWebKit,全新的QtHelp模塊,開始支持wince平臺

   4.5 2009.03.03  添加LPGL受權,ActivQt模塊在Qt4.5.2才實現了在LPGL版中可用

   4.6 2009.12.01  全部源碼統一成一份,qt everywhere,開始支持Symbian平臺

   4.7 2010.09.21  增長QtDeclarative模塊,增長QML

   ……

2. Qt4模塊:

  QtCoreQt提供的非GUI核心類庫。 

  QtGui,圖形用戶界面組件。

  QtMultimedia,多媒體支持。

  QtNetwork,網絡支持。

  QtOpenGL,提供對OpenGL 的支持。

  QtOpenVG,提供對OpenVG 的支持。

  QtScript,提供對Qt Scripts的支持。Qt Script是一種相似於JavaScript的腳本語言。

  QtScriptTools,爲Qt Script提供的額外組件。

  QtSql,提供對SQL數據庫的支持。

  QtSvg,提供對SVG文件的支持。

  QtWebKit,提供顯示和編輯Web內容。

  QtXmlXML處理。

  QtXmlPatterns,提供對XQueryXPath等的支持。

  QtDeclarative,用於編寫動畫形式的圖形用戶界面的引擎。

  Phonon,多媒體框架。

  Qt3SupportQt3兼容類庫。

 

   Qt4的工具模塊:

  QtDesigner,用於擴展Qt Designer

  QtUiTools,用於在本身的引用程序中處理Qt Designer生成的form文件。

  QtHelp,聯機幫助。

  QtTest,單元測試。

 

  3. 經常使用對象

  QWidgetQFrameQDialogQPushButtonQMenuQTableViewQTreeViewQListView等。經常使用對話框類:

  QColorDialog:選擇顏色;

  QFileDialog:選擇文件或者目錄;

  QFontDialog:選擇字體;

  QInputDialog:容許用戶輸入一個值,並將其值返回;

  QMessageBox:模態對話框,用於顯示信息、詢問問題等;

  QPageSetupDialog:爲打印機提供紙張相關的選項;

  QPrintDialog:打印機配置;

  QPrintPreviewDialog:打印預覽;

  QProgressDialog:顯示操做過程。

   更多請參考Qtassistantqdoc

   變化歷史請參閱qthelp://com.trolltech.qt.483/qdoc/qt4-8-intro.html

 

2、編程相關

0. C++語言標準自己是不區分跨平臺的,Qt是跨平臺的C++類庫實現,C/C++有的儘可能不用Qt的實現,特別是非界面程序。

 Qt是可‘剪裁’的,所實現的模塊比較多,須要什麼功能纔去引用對用的模塊,這點兒與MFC不一樣。C++的容器類,在Qt中有對應的實現,對於後臺服務等不帶界面的程序,不建議使用Qt的功能方法,以免引入Qt的庫。

1. Qt工具

Qt Designer: 界面設計工具,所見即所得,支持layout, 支持signal/slot編輯。 生成的文件保存爲ui格式, uixml格式的普通文本文件, 默認編碼爲utf8

Qt Assistant: QtAPI幫助文檔查看工具, 支持html的子集(圖片、超鏈、文本着色), 支持目錄結構、關鍵字索引和全文搜索,是Qt編程必備、使用率最高的工具。

Qtdemo: Qt例子和演示程序的加載器,用於查看Qt提供的例子程序,不只能夠看到程序運行的狀況,還能夠查看源碼和文檔

Qmake: 用於生成Makefile的命令行工具。讀取Qt自己的配置(平臺配置、pro文件), 爲程序生成與庫一致的Makefile。 它是Qt跨平臺編譯系統的基礎。

Qt Linguist: Qt語言家的,用於界面國際化,主要任務只是讀取翻譯文件、爲翻譯人員提供友好的翻譯界面。 Linguist必需要和其餘工具一塊兒用才能完成Qt國際化。

Lupdate:國際化的命令行工具之一, 它的功能是從源碼文件或其餘資源文件中提取須要翻譯的字符串,並將之用正確的編碼和格式存入tsxml格式)文件中。 

Lrelease: 國際化的命令行工具之一, 它負責將ts文件轉化爲程序使用的qm文件。 轉化過程最大的變化是去掉了原始文件中全部的空白和未翻譯的內容, 並將存儲格式壓縮。

UicUI Compiler命令行工具是,用來編譯ui文件,把ui文件轉化爲編譯器能夠識別的標準C++文件, 生成的文件是一個.h

MocMeta Object Compiler元對象編譯器(預編譯工具), 用來生成與信號和槽相關的底層代碼。 該工具處理帶有Q_OBJECT宏的頭文件, 生成形如moc_xxx.h, moc_xxx.cppC++代碼,以後再與程序的代碼一同編譯。

RccResource Compiler資源文件編譯工具,根據資源定義qrc文件的內容將相關的文件編譯爲二進制,並與源碼編譯在一塊兒,保存在應用程序的二進制文件中。

QtconfigX11系統下用於配置Qt環境的工具。 能夠設定字體、StylePalette、打印機等。 設定信息保存在用戶目錄。

2. designerlayout

Qt3designer能夠編輯代碼並管理工程,Qt4designer相對弱化了,主要是設計界面元素。如下二圖大體描述了二者的區別:

 

 

designer提供了信號槽關聯功能,仍是建議在本身的程序代碼裏實現信號與槽的關聯。

 

若是須要固定窗體大小,能夠設置窗體屬性實現。不建議使用絕對座標固定窗體內的控件位置,儘可能使用佈局管理窗體內控件,以免因爲國際化而使得界面元素/信息顯示不全。

 

佈局管理類型用於描述一個應用程序的用戶界面中的Widget是如何放置。當視窗縮放時,佈局管理器會自動調整widget的大小、位置或是字號,確保他們相對的排列和用戶界面總體仍然保有可用性。

 

Qt自帶的佈局管理類型有:QHBoxLayoutQVBoxLayoutQGridLayoutQFormLayout。這些類型繼承自QLayout,但QLayout非繼承自QWidget而是直接源於QObject。它們負責widget的幾何管理。

QHBoxLayout:配置widget成橫向一列

QVBoxLayout:配置widget成垂直一行

QGridLayout:配置widget在平面網格

QFormLayout:配置widget用於2欄標籤- field

 

設計界面時,先建立各個控件,而後設置layout

QGridLayout對設置佈局前的窗口布局依賴比較大,設計佈局前能夠先將界面控件大體按照預想的佈局排列一下,再應用佈局。

QGridLayout包含多個grid,一般狀況下,每一個gridsize是不一樣的,在其中添加的widget在垂直或水平方向上可跨越或者佔據多少個grid

 

ui製做時注意,ui文件命名影響代碼中引用該ui的頭文件名,如uidialog.ui -> ui_uidialog.h以及ui_uidialog.cppui窗體的類名影響代碼中該ui生成的C++類的名稱,如uidialog.ui的類名屬性爲NormalDialog,生成界面類Ui_NormalDialogUi::NormalDialog

3. signal/slot

能夠簡單的認爲一個調用點(信號)與零個或者多個‘回調’(槽函數)相連。

信號槽這一術語最初來自 Trolltech 公司的 Qt 庫。1994Qt 的第一個版本發佈,帶來了信號槽的概念,現在信號槽依然是 Qt 庫的核心之一。其餘許多庫(如boost)也提供了相似的實現。

 

相比於直接函數調用(回調),信號槽比較安全,可是一個信號槽的調用,可能會耗費更多的時間/空間,同時不能使用 inline,可是卻增長了靈活性。

 

槽的關聯(connect)與刪除(disconnect)能夠是動態的。

一個信號能夠關聯多個槽,各個槽按照被connect的順序被執行(Qt 4.6以前執行順序不肯定),但最好不要指望其順序執行!

 

   槽是普通的c++成員函數,能夠是虛函數,也能夠被重載,能夠是公有的,保護的或私有的,能夠傳遞任何類型的參數,能夠有返回值,在信號觸發槽函數時,返回值被忽略。

 

   若是信號的參數比它所鏈接的槽的參數多,信號中多餘的參數會被忽略掉。建議SIGNALSLOT使用相同的參數。

 

   要避免槽中再次發射所接收到的一樣信號(死循環)。

 

QSignalMapper類:用於多個信號(signal)鏈接到同一個槽(slot),而這個槽又需區別處理每一個信號的狀況。QSignalMapper類收納了一個無參數的信號集,而後相應於原發射信號的對象用整型、字符串或widget參數進行信號重發。QSignalMapper::setMapping()方法用於映射全部widget的信號到單個QSignalMapper對象。而刪除映射能夠用QSignalMapper::removeMappings()方法。而後widget的信號鏈接到QSignalMapper::map()槽。最後,QSignalMapper::mapped()信號鏈接到任何自定義widgetsingal/slot作須要的處理。

4. 國際化

不建議程序裏須要顯示在界面的內容直接使用中文,不建議直接在ui界面上使用中文(儘管designer支持這樣作),儘可能使用翻譯文件作中文化處理。

 

Qt類中的多語言處理可使用QObject::tr()翻譯,或者自定義一個類(從QObject派生)來處理。

 

中文國際化翻譯文件的名稱格式最好可以統一,如中文翻譯文件名:[模塊名稱]_zh.qm,以便於管理及程序運行時的語言切換。建議翻譯文件和二進制文件在同一目錄下。

 

QT中全部的字符串都是用Unicode編碼的.若是咱們有一個本地編碼系統的字符串的話,咱們能夠簡單的經過QString::fromLocal8Bit()QString::toLocal8Bit().data()進行轉換。在Windows平臺下這些都是沒有問題的,可是在QT4.1.1的版本之後,UNIX平臺這樣的轉換會形成出現不少的亂碼。出現這個問題的緣由是QT不能獲得正確的本地編碼類型,因此須要強制設定一下。例如:

QTextCodec::setCodecForLocale(QTextCodec::codecForName("GB18030"));

5. 資源文件

主要是程序使用的圖標,建議使用png格式(可以確保在不一樣的平臺上有一致的顯示效果)並使用Qt提供的資源管理方案。文件名的後綴使用小寫png

模塊的資源文件愛你統一放置在[安裝目錄]\資源文件目錄\[模塊名稱]下,便於管理。

6. Q_OBJECT/Q_PROPERTY

Q_OBJECT宏,生成一個包含元對象代碼的C++源文件,元對象代碼對信號/槽機制、運行時類型信息和動態屬性系統是須要的。

Q_PROPERTY宏用於聲明瞭對象屬性,如:

Q_PROPERTY( Priority priorityREAD priority WRITE setPriority )

void setPriority( Priority );

Priority priority() const;

 若是程序中的某個類使用了信號槽或者其它的Qt特性,編譯時遇到Meta-Object相關錯誤,多數與沒有使用Q_OBJECT宏有關,使用Q_OBJECT宏並從新qmake後便可解決。

    包含Q_OBJECT的代碼(*.h *.cpp) 在構建過程當中會被預編譯爲 moc_*.cpp, *.moc

7. 插件支持

Qt有兩種與插件有關的API。一種用來擴展Qt自己的功能,如自定義數據庫驅動,圖像格式,文本編解碼,自定義分格,等等,稱爲Higher-Level API。另外一種用於應用程序的功能擴展,稱爲Lower-Level API。前一種是創建在後一種的基礎之上的。

 

基本上咱們不須要擴展Qt自己的功能,對咱們有用的是後一種,即用來擴展應用程序的Lower-level API

 

讓應用程序支持插件擴展的步驟:

a. 定義一個接口集(只有純虛函數的類),用來與插件交流。

b. 用宏Q_DECLARE_INTERFACE()將該接口告訴Qt元對象系統,如:

Q_DECLARE_INTERFACE(BrushInterface,"com.shr.plugin.hmi/1.0")

c. 應用程序中用QPluginLoader來裝載插件。

d. 用宏qobject_cast()來肯定一個插件是否實現了接口。

 QObject *obj = new QTimer;

QTimer *timer = qobject_cast<QTimer *>(obj);

 

寫一個插件的步驟:

a. 聲明插件類,該類從QObject和該插件但願實現的接口繼承而來。

b. 用宏Q_INTERFACES()將該接口告訴Qt元對象系統。

class BasicToolsPlugin : public QObject, public BrushInterface,

  public ShapeInterface, public FilterInterface

{

Q_OBJECT

Q_INTERFACES(BrushInterface ShapeInterface FilterInterface)

public:

...

};

c. 用宏Q_EXPORT_PLUGIN2()導出插件。

Q_EXPORT_PLUGIN2 ( PluginName, ClassName )

d. 用適當的.pro文件構建插件。

 

8. Model/View

Model-View-Controller(MVC)由三種對象組成,Model是應用程序對象,View是它的屏幕表示,Controller定義了用戶界面如何對用戶輸入進行響應。

 

viewcontroller結合在一塊兒,就是model/view結構,與MVC都基於一樣的思想,但它更簡單一些。這種分離使得在幾個不一樣的view上顯示同一個數據成爲可能,也能夠從新實現新的view,而沒必要改變底層的數據結構。

 

爲了更靈活的對用戶輸入進行處理,引入了delegate這個概念(QItemDelegate對象)。它的好處是,數據項的渲染(繪製方式)與編程能夠進行定製,主要用於表格、樹或列表的對象顯示及編輯方式。以下圖所示:

 

model與數據源通信,並提供接口給別的組件使用。通信的性質依賴於數據源的種類與model實現的方式。viewmodel獲取model indexes,後者是數據項的引用。經過把model indexes提供給modelview能夠從數據源中獲取數據。在標準的views中,delegate會對數據項進行渲染,當某個數據項被選中時,delegate經過model indexesmodel直接進行交流。

 

model/view 相關類能夠被分紅上面所提到的三組:modelsviewsdelegates。這些組件經過抽象類來定義,它們提供了共同的接口(在某些狀況下,還提供了缺省的實現)。抽象類意味着容許實現定製的組件,子類化以提供完整的其餘組件但願的功能。Modelsviewsdelegates之間經過信號/槽機制來進行通信:

l 從model發出的信號通知view數據源中的數據發生了改變。

l 從view發出的信號提供了有關被顯示的數據項與用戶交互的信息。

l 從delegate發生的信號被用於在編輯時通知modelview當前編輯器的狀態信息。

 

全部的item models都基於QAbstractItemModel類,這個類定義了用於viewsdelegates訪問數據的接口。QAbstractItemModel提供給數據接口,QAbstractListModelQAbstractTableModel是其針對tablelist的實例類。QT提供了一些現成的models用於處理數據項:

QStringListModel 用於存儲簡單的QString列表。

QStandardItemModel 管理複雜的樹型結構數據項,每項均可以包含任意數據。

QDirModel 提供本地文件系統中的文件與目錄信息。

QSqlQueryModelQSqlTableModelQSqlRelationTableModel用來訪問數據庫。

 

若是標準Model不知足你的須要,應該子類化QAbstractItemModelQAbstractListModel或是QAbstractTableModel來定製。

 

基於QAbstractItemView抽象基類:QListView把數據顯示爲一個列表,QTableViewModel 中的數據以table的形式表現,QTreeView 用具備層次結構的列表來顯示model中的數據。功能不知足要求時,能夠子類化以便知足定製需求。

 

QAbstractItemDelegate model/view架構中的用於delegate的抽象基類。缺省的delegate實如今QItemDelegate類中提供。

 

model/view架構中,從新實現QAbstractItemModel::sort()函數來來支持排序。QTableViewQTreeView都提供了默認API,容許以編程的方式對Model數據進行排序。

 

假如model沒有提供須要的接口或是你想用list view表示數據,能夠用一個代理model在用view表示數據以前對你的model數據結構進行轉換。

 

爲與Qt 3兼容, QListWidgetQTreeWidgetQTableWidget等提供瞭如Qt 3中的QListBoxQlistViewQTable類似的行爲。但比着View類缺乏靈活性,因此不建議直接使用QListWidgetQTreeWidgetQTableWidget等,應儘可能使用對應Model/View來替代。

 

9. 內存管理

全部繼承自QOBJECT類的類,若是在new的時候指定了父親,在父親被delete的時候它會被delete,因此若是一個程序中,全部的QOBJECT類都指定了父親,那麼他們是會一級級的在最上面的父親清理時被清理,而不用本身清理。

 

程序一般最上層會有一個根的QOBJECT,(放在setCentralWidget中的那個QOBJECT),這個QOBJECTnew的時候沒必要指定它的父親(它的父親爲QAPPLICATION),程序退出時會被自動清理。除此之外,對沒有父親的QWidget派生類對象,須要本身維護其生命週期或者使用setAttribute(Qt::WA_DeleteOnClose)

 

   QT中建議不要直接delete掉一個QOBJECT對象,爲避免意想不到的內存錯誤,界面QWidget及其派生類對象儘可能經過new分配在heap中,而不是在stack中。

 

QT不建議在一個QOBJECT 的父親的範圍以外持有對這個QOBJECT的指針(若是這樣外面的指針極可能不會察覺這個QOBJECT被釋放,會出現錯誤),若是要這樣在外部持有QOBJECT的指針,建議使用引用或者用智能指針。

10. QWidget

 QWidget類是全部用戶界面對象的基類。QWidget的方法所有都掌握了,使用Qt庫編寫界面程序會變得十分容易。

 

 一般狀況下,頂級窗口部件是有框架和標題欄的窗口,一個沒有父窗口部件的窗口部件一直是頂級窗口部件。 QMainWindow和不一樣的QDialog的子類是最普通的頂級窗口。

 

非頂級窗口部件是子窗口部件。它們是其父窗口部件中的子窗口,能夠簡單的認同爲控件。在Qt中的絕大多數其它窗口部件僅僅做爲子窗口部件纔是有用的。(固然把一個按鈕做爲或者叫作頂級窗口部件也是可能的,但絕大多數人喜歡把他們的按鈕放到其它按鈕當中,好比QDialog。)

 

QWidget有不少成員函數,可是它們中的一些有少許的本身歷來不用的直接功能(如,字體屬性),有不少繼承它的子類提供了實際的功能,好比QPushButtonQListBoxQTabDialog等。

 

QWidget的成員函數分組: 

上下文  函數 

窗口函數  show()hide()raise()lower()close()

 

頂級窗口  caption()setCaption()icon()setIcon()iconText()setIconText()isActiveWindow()setActiveWindow()showMinimized()showMaximized()showFullScreen()showNormal()

 

窗口內容  update()repaint()erase()scroll()updateMask()

幾何形狀  pos()size()rect()x()y()width()height()sizePolicy()setSizePolicy()sizeHint()updateGeometry()layout()move()resize()setGeometry()frameGeometry()geometry()childrenRect()adjustSize()mapFromGlobal()mapFromParent()mapToGlobal()mapToParent()maximumSize()minimumSize()sizeIncrement()setMaximumSize()setMinimumSize()setSizeIncrement()setBaseSize()setFixedSize()

模式  isVisible()isVisibleTo()visibleRect()isMinimized()isDesktop()isEnabled()isEnabledTo()isModal()isPopup()isTopLevel()setEnabled()hasMouseTracking()setMouseTracking()isUpdatesEnabled()setUpdatesEnabled()

觀感  style()setStyle()cursor()setCursor()font()setFont()palette()setPalette()backgroundMode()setBackgroundMode()colorGroup()fontMetrics()fontInfo()

鍵盤焦點函數 isFocusEnabled()、setFocusPolicy()、focusPolicy()、hasFocus()、setFocus()、clearFocus()、setTabOrder()、setFocusProxy()

鼠標和鍵盤捕獲  grabMouse()releaseMouse()grabKeyboard()releaseKeyboard()mouseGrabber()keyboardGrabber()

事件處理器  event()mousePressEvent()mouseReleaseEvent()mouseDoubleClickEvent()mouseMoveEvent()keyPressEvent()keyReleaseEvent()focusInEvent()focusOutEvent()wheelEvent()enterEvent()leaveEvent()paintEvent()moveEvent()resizeEvent()closeEvent()dragEnterEvent()dragMoveEvent()dragLeaveEvent()dropEvent()childEvent()showEvent()hideEvent()customEvent()

變化處理器  enabledChange()fontChange()paletteChange()styleChange()windowActivationChange()

系統函數  parentWidget()topLevelWidget()reparent()polish()winId()find()metric()

這是什麼的幫助  customWhatsThis()

內部核心函數  focusNextPrevChild()wmapper()clearWFlags()getWFlags()setWFlags()testWFlags()

每個窗口部件構造函數接受兩個或三個標準參數: 

QWidget *parent = 0是新窗口部件的父窗口部件。若是爲0(默認),新的窗口部件將是一個頂級窗口部件。若是不是,它將會使parent的一個孩子,而且被parent的幾何形狀所強迫(除非你指定WType_TopLevel做爲窗口部件標記)。

const char *name = 0是新窗口部件的窗口部件名稱。你可使用name()來訪問它。窗口部件名稱不多被程序員用到,可是對於圖形用戶界面構造程序,好比Qt設計器,是至關重要的(你能夠在Qt設計器中命名一個窗口部件,而且在你的代碼中使用這個名字來鏈接它)。dumpObjectTree()調試函數也使用它。

WFlags f = 0(在可用的狀況下)設置窗口部件標記,默認設置對於幾乎全部窗口部件都是適用的,可是,舉例來講,一個沒有窗口系統框架的頂級窗口部件,你必須使用特定的標記。

QWidget的經常使用事項處理函數: 

paintEvent() - 只要窗口部件須要被重繪就被調用。每一個要顯示輸出的窗口部件必須實現它而且不在paintEvent()以外在屏幕上繪製是明智的。 

resizeEvent() - 當窗口部件被從新定義大小時被調用。 

mousePressEvent() - 當鼠標鍵被按下時被調用。有六個鼠標相關事件,可是鼠標按下和鼠標釋放事件是到目前爲止最重要的。當鼠標在窗口部件內或者當它使用grabMouse()來捕獲鼠標時,它接收鼠標按下事件。

mouseReleaseEvent() - 當 鼠標鍵被釋放時被調用。當窗口部件已經接收相應的鼠標按下事件時,它接收鼠標釋放事件。這也就是說若是用戶在你的窗口部件內按下鼠標,而後拖着鼠標到其它 某個地方,而後釋放,你的窗口部件接收這個釋放事件。這裏有一個例外:若是出如今彈出菜單中,當鼠標鍵被按下時,這個彈出菜單當即會偷掉這個鼠標事件。

mouseDoubleClickEvent() - 和 它看起來也許不太同樣。若是用戶雙擊,窗口部件接收一個鼠標按下事件(若是他們沒有拿牢鼠標,也許會出現一個或兩個鼠標移動事件)、一個鼠標釋放事件而且 最終是這個事件。直到你看到第二次點擊是否到來以前,不能從一個雙擊中辨別一個點擊。(這是爲何絕大多數圖形用戶界面圖書建議雙擊是單擊的一個擴展,而 不是一個不一樣行爲的觸發的一個緣由。)

若是你的窗口部件僅僅包含子窗口部件,你也許不須要實現任何一個事件處理器。若是你想檢測在子窗口部件中的鼠標點擊,請在父窗口部件的mousePressEvent()中調用子窗口部件的hasMouse()函數。

接收鍵盤的窗口部件須要從新實現一些更多的事件處理器: 

keyPressEvent() - 只要鍵被按下和當鍵已經被按下足夠長的時間能夠自動重複了就被調用。注意若是TabShift+Tab鍵被用在焦點變換機制中,它們僅僅被傳遞給窗口部件。爲了強迫那些鍵被你的窗口部件處理,你必須從新實現QWidget::event()

focusInEvent() - 當窗口部件得到鍵盤焦點(假設你已經調用setFocusPolicy())時被調用。寫得好的窗口部件意味着它們能按照一種清晰但謹慎的方式來得到鍵盤焦點。

focusOutEvent() - 當窗口部件失去鍵盤焦點時被調用。 

一些窗口部件也許須要實現一些不太普通的事件處理器: 

mouseMoveEvent() - 只要當鼠標鍵被按下時鼠標移動就會被調用。舉例來講,對於拖動,這個頗有用。若是你調用setMouseTracking(TRUE),儘管沒有鼠標鍵被按下,你也會得到鼠標移動事件。(注意這個使用鼠標跟蹤的應用程序在低下的X鏈接下不是頗有用。)(也能夠參考拖放信息。)

keyReleaseEvent() - 只要鍵被釋放和當若是這個鍵是自動重複的而且被按下一段時間時就被調用。在這種狀況下窗口部件接收一個鍵釋放事件而且對於每個重複當即有一個鍵按下事件。注意若是TabShift+Tab鍵被用在焦點變換機制中,它們僅僅被傳遞給窗口部件。爲了強迫那些鍵被你的窗口部件處理,你必須從新實現QWidget::event()

wheelEvent() -- 當窗口部件擁有焦點時,只要用戶轉動鼠標滾輪就被調用。 

enterEvent() - 當鼠標進入這個窗口部件屏幕空間時被調用。(這不包括被這個窗口部件的子窗口部件所擁有的屏幕空間。) 

leaveEvent() - 當鼠標離開這個窗口部件的屏幕空間時被調用。 

moveEvent() - 當窗口部件相對於它的父窗口部件已經被移動時被調用。 

closeEvent() - 當用戶關閉窗口部件時(或這當close()被調用時)被調用。 

當實現一個窗口部件時,還有一些更多的事情要考慮。 

l 在構造函數中,在你可能收到一個事件的任何機會以前,請確認儘早地設置你的成員變量。 

l 從新實現sizeHint()在絕大多數狀況下都是頗有用的而且使用setSizePolicy(),來設置正確的大小策略,這樣能夠更容易地設置佈局管理器。一個大小策略可讓你爲佈局管理器提供好的默認狀況,這樣其它窗口部件能夠很容易地包含和管理你的窗口部件。sizeHint()爲這個窗口部件說明一個「好的」大小。

l 若是你的窗口部件是一個頂級窗口部件,setCaption()setIcon()分別設置標題欄和圖標。 

11. 動態庫導出QWidget界面窗口類

能夠經過動態庫導出Qt的界面類(QWidget派生類),就跟QtGui導出的界面類同樣。

 

實例:

  #ifndef QMYWIDGET_H

 #define QMYWIDGET_H

 #include <QtGui/QWidget>

 

 #if defined(QMYWIDGET_LIBRARY)

 #  define QMYWIDGETSHARED_EXPORT Q_DECL_EXPORT

 #else

 #  define QMYWIDGETSHARED_EXPORT Q_DECL_IMPORT

 #endif

 

 namespace Ui {    class Form;   }

 

 class QMYWIDGETSHARED_EXPORT QMyWidget : public QWidget

 {

      Q_OBJECT

 public:

      QMyWidget(QWidget *parent=0);

 private:

      Ui::Form *m_form;

 }; 

#endif // QMYWIDGET_H

如上例,界面類使用了ui對象,使用事先聲明避免在導出類的聲明頭文件中包含ui對應的頭文件(使用ui對象指針)。

12. QtCreator

 Qt4在諾基亞的管理期間獲得了迅速的發展。同時諾基亞對Qt的一個很大的貢獻是組織開發了QtCreator

QtCreator支持C/C++/QtQML開發,能很好的發揮Qt 跨平臺的特色。在任何平臺上,只要可以編譯Qt,那麼使用QtCreator便不是問題—由於它是使用Qt開發的。

13. Qt User Interface Creation Kit

   Qt Quick2將使用Scene Graph,更好地發揮GPU的性能;QML創建在Scene Graph的基本結構之上

14. Qt5

基礎模塊:

Qt Core,提供核心的非 GUI 功能,全部模塊都須要這個模塊。

這個模塊的類包括了動畫框架、定時器、各個容器類、時間日期類、事件、IOJSON、插件機制、智能指針、圖形(矩形、路徑等)、線程、XML 等。全部這些類均可以經過 <QtCore> 頭文件引入。

Qt Gui,提供 GUI 程序的基本功能,包括與窗口系統的集成、事件處理、OpenGL 和 OpenGL ES 集成、2D 圖像、字體、拖放等。

這些類通常由 Qt 用戶界面類內部使用,固然也能夠用於訪問底層的 OpenGL ES 圖像 API

Qt Gui 模塊提供的是全部圖形用戶界面程序都須要的通用功能。

Qt Multimedia,提供視頻、音頻、收音機以及攝像頭等功能。

這些類能夠經過 <QtMultimedia> 引入,並且須要在 pro 文件中添加 QT += multimedia

Qt Network,提供跨平臺的網絡功能。

這些類能夠經過 <QtNetwork> 引入,並且須要在 pro 文件中添加 QT += network

Qt Qml,提供供 QML(一種腳本語言,也提供 JavaScript 的交互機制) 使用的 C++ API

這些類能夠經過 <QtQml> 引入,並且須要在 pro 文件中添加 QT += qml

Qt Quick,容許在 Qt/C++ 程序中嵌入 Qt Quick(一種基於 Qt 的高度動畫的用戶界面,適合於移動平臺開發)。

     這些類能夠經過 <QtQuick> 引入,並且須要在 pro 文件中添加 QT += quick

Qt SQL,容許使用 SQL 訪問數據庫。

        這些類能夠經過 <QtSql> 引入,並且須要在 pro 文件中添加 QT += sql

Qt Test,提供 Qt 程序的單元測試功能。

        這些類能夠經過 <QtTest> 引入,並且須要在 pro 文件中添加 QT += testlib

Qt Webkit,基於 WebKit2 的實現以及一套全新的 QML APIQt 4.8 附帶的是 QtWebkit 2.2)。

 

擴展模塊:

Qt 3D,提供聲明式語法,在 Qt 程序中能夠簡單地嵌入 3D 圖像。

Qt 3D 爲 Qt Quick 添加了 3D 內容渲染。Qt 3D 提供了 QML 和 C++ 兩套 API,用於開發 3D 程序。

Qt Bluetooth,提供用於訪問藍牙無線設備的 C++ 和 QML API

Qt Contacts,用於訪問地址簿或者聯繫人數據庫的 C++ 和 QML API

Qt Concurrent,封裝了底層線程技術的類庫,方便開發多線程程序。

Qt D-Bus,這是一個僅供 Unix 平臺使用的類庫,用於利用 D-Bus 協議進行進程間交互。

Qt Graphical Effects,提供一系列用於實現圖像特效的類,好比模糊、銳化等。

Qt Image Formats,支持圖片格式的一系列插件,包括 TIFFMNGTGA 和 WBMP

Qt JS Backend,該模塊沒有公開的 API,是 V8 JavaScript 引擎的一個移植。這個模塊僅供 QtQml 模塊內部使用。

Qt Location,提供定位機制、地圖和導航技術、位置搜索等功能的 QML 和 C++ API

Qt OpenGL,方便在 Qt 應用程序中使用 OpenGL

     該模塊僅僅爲了程序從 Qt 4 移植到 Qt 5 的方便才保留下來,

若是你須要在新的 Qt 5 程序中使用 OpenGL 相關技術,須要使用的是 QtGui 模塊中的 QOpenGL

Qt Organizer,使用 QML 和 C++ API 訪問組織事件(organizer event)。

organizer API 是 Personal Information Management API 的一部分,用於訪問 Calendar 信息。經過 Organizer API 能夠實現:從日曆數據庫訪問日曆時間、導入 iCalendar 事件或者將本身的事件導出到 iCalendar

Qt Print Support,提供對打印功能的支持。

Qt Publish and Subscribe,爲應用程序提供對項目值的讀取、導航、訂閱等的功能。

Qt Quick 1,從 Qt 4 移植過來的 QtDeclarative 模塊,用於提供與 Qt 4 的兼容。

        若是你須要開發新的程序,須要使用 QtQuick 模塊。

Qt Script,提供腳本化機制。這也是爲提供與 Qt 4 的兼容性,若是要使用腳本化支持,請使用 QtQml 模塊的 QJS* 類。

Qt Script Tools,爲使用了 Qt Script 模塊的應用程序提供的額外的組件。

Qt Sensors,提供訪問各種傳感器的 QML 和 C++ 接口。

Qt Service Framework,提供客戶端發現其餘設備的服務。

Qt Service Framework 爲在不一樣平臺上發現、實現和訪問服務定義了一套統一的機制。

Qt SVG,提供渲染和建立 SVG 文件的功能。

Qt System Info,提供一套 API,用於發現系統相關的信息,好比電池使用量、鎖屏、硬件特性等。

Qt Tools,提供了 Qt 開發的方便工具,包括 Qt CLuceneQt DesignerQt Help 以及 Qt UI Tools 

Qt Versit,提供了對 Versit API 的支持。

        Versit API 是 Personal Information Management API 的一部分,

        用於 QContacts 和 vCard 以及 QOrganizerItems 和 iCalendar 之間的相互轉換。

Qt Wayland,僅用於 Linux 平臺,用於替代 QWS,包括 Qt Compositor APIserver)和 Wayland 平臺插件(clients)。

Qt WebKit,從 Qt 4 移植來的基於 WebKit1 和 QWidget 的 API

Qt Widgets,使用 C++ 擴展的 Qt Gui 模塊,提供了一些界面組件,好比按鈕、單選框等。

Qt XMLSAX 和 DOM 的 C++ 實現。該模塊已經廢除,請使用 QXmlStreamReader/Writer

Qt XML Patterns,提供對 XPathXQueryXSLT 和 XML Schema 驗證的支持。

第三方資源

 QCharts is a part of Qt Commercial addons package. It provides a set of easy to use chart components which are available for Qt Commercial customers. It uses Qt Graphics View Framework, therefore charts can be easily integrated to modern user interfaces. QCharts can be used as QWidgets, QGraphicsWidget or QML elements. Users can easily create impressive graphs by selecting one of the charts themes.

QWT,全稱是Qt Widgets for Technical Applications,是一個基於LGPL版權協議的開源項目, 可生成各類統計圖。它爲具備技術專業背景的程序提供GUI組件和一組實用類,其目標是以基於2D方式的窗體部件來顯示數據, 數據源以數值,數組或一組浮點數等方式提供, 輸出方式能夠是Curves(曲線),Slider(滾動條),Dials(圓盤),Compasses(儀表盤)等等。該工具庫基於Qt開發,因此也繼承了Qt的跨平臺特性。

KD Chart is a tool for creating business charts and is the most powerful Qt component of its kind. Besides having all the standard features, it enables the developer to design and manage a large number of axes and provides sophisticated customization. 

KD Chart utilizes the Qt Model-View programming model and allows for re-use of existing data models to create charts. KD Chart is a complete implementation of the ODF (OpenDocument) Chart specification. It now includes Stock Charts, Box & Whisker Charts and the KD Gantt module for implementing ODF Gantt charts into applications.

QicsTable is a full-featured, high-performance, Qt-based table widget suited for use in industrial-strength applications. It provides unparalleled performance, scalability and flexibility. 

KD ReportsWith KD Reports, you can add high-quality reporting to your Qt applications. KD Reports accesses your application data and uses a programmer-provided page description in order to generate good-looking reports, including automated page-breaking for multi-page reports.KD Reports supports automatic and custom tables, variable headers and footers, as well as text and image elements. An easy-to-use built-in layout engine gives you flexibility for arranging your reports.

  

 

學習資源:最好的是Qt自帶的assistantexample

   如下參考網站:

   http://blog.qt.digia.com/ 

   http://www.cuteqt.com/blog/ 

   http://blog.csdn.net/dbzhang800 

   http://hi.baidu.com/new/dbzhang800

相關文章
相關標籤/搜索