Qt入門培訓(xùn)教學(xué)課件_第1頁
Qt入門培訓(xùn)教學(xué)課件_第2頁
Qt入門培訓(xùn)教學(xué)課件_第3頁
Qt入門培訓(xùn)教學(xué)課件_第4頁
Qt入門培訓(xùn)教學(xué)課件_第5頁
已閱讀5頁,還剩105頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

1、.Qt入門培訓(xùn)Qt introduction 第1頁,共110頁。Qt簡介Qt的使用Qt深入理解Qt的應(yīng)用第2頁,共110頁。Qt簡介什么是Qt?第3頁,共110頁。什么是Qt?原來用作用戶界面開發(fā),現(xiàn)可用作所有的開發(fā)例如:Databases, XML, WebKit, multimedia, networking, OpenGL, scripting, non-GUI.”Qt 是一個用C+編寫的跨平臺開發(fā)框架.”第4頁,共110頁。什么是Qt?Qt由模塊構(gòu)建QtCorePhononQtXmlPatternsQtXmlQtWebKitQtSvgQtSqlQtScriptQtOpenVGQtOp

2、enGLQtNetworkQtMultimediaQtGui第5頁,共110頁。什么是QT?Qt用宏(macros)和內(nèi)省(introspection)擴展了C+所有的代碼仍然是簡明C + +foreach (int value, intList) QObject *o = new QPustButton;o-metaObject()-className(); / 返回 ”QPushButton”connect(button, SIGNAL(clicked(), window, SLOT(close();第6頁,共110頁。Qt的目的一次編寫,到處編譯根據(jù)不同平臺的本地觀感生成相應(yīng)的本地應(yīng)用簡

3、單地使用API,高開發(fā)效率,開放性,使用有趣第7頁,共110頁。Qt的歷史19901991199419992001Haavard 和Eirik靈感閃現(xiàn)開始設(shè)計,并提出信號和槽的概念1993開發(fā)出Qt的第一個圖形核心命名為Qt,并建立“奇趣科技”1995簽訂第一個合同,開始快速發(fā)展。1997Qt1.2發(fā)布, 并且用于開發(fā)KDE。Qt 2.0發(fā)布Qt 3.0發(fā)布。2005Qt 4.0發(fā)布2008Nokia收購奇趣科技第8頁,共110頁。Qt的跨平臺桌面平臺WindowsMac OS XLinux/Unix X11第9頁,共110頁。Qt的跨平臺嵌入式平臺Windows CESymbianMaemo

4、嵌入式Linux第10頁,共110頁。Qt的授權(quán)LGPL 免費你的應(yīng)用程序可以是開源的或者是不開源的對Qt的修改,必須反饋到社區(qū)GPL 免費你的應(yīng)用程序必須是開源的對Qt的修改,必須反饋到社區(qū)商業(yè)的 收費你的應(yīng)用程序可以是不開源 的對Qt的修改,可以不開源第11頁,共110頁。Qt簡介Qt的使用Qt深入理解Qt的應(yīng)用第12頁,共110頁。Qt的代碼結(jié)構(gòu)-Hello World第13頁,共110頁。Qt的代碼結(jié)構(gòu)-Hello World#include #include int main( int argc, char *argv ) QApplication app( argc, argv )

5、; QLabel l( Hello World! ); l.show(); return app.exec();第14頁,共110頁。Qt的代碼結(jié)構(gòu)-Hello World#include #include int main( int argc, char *argv ) QApplication app( argc, argv ); QLabel l( Hello World! ); l.show(); return app.exec();第15頁,共110頁。Qt的代碼結(jié)構(gòu)-Hello World#include #include int main( int argc, char *arg

6、v ) QApplication app( argc, argv ); QLabel l( Hello World! ); l.show(); return app.exec();第16頁,共110頁。Qt的代碼結(jié)構(gòu)-Hello World#include #include int main( int argc, char *argv ) QApplication app( argc, argv ); QLabel l( Hello World! ); l.show(); return app.exec();第17頁,共110頁。Qt的代碼結(jié)構(gòu)-Hello World#include #inc

7、lude int main( int argc, char *argv ) QApplication app( argc, argv ); QLabel l( Hello World! ); l.show(); return app.exec();第18頁,共110頁。Qt開發(fā)工具集Qt CreatorQt DesignerQt LinguistQt AssisantQt Demos第19頁,共110頁。信號(Signal)與槽(Slot)初探QT提供的一種在對象間進行通訊的技術(shù)。動態(tài)地或松散地將事件和狀態(tài)變化聯(lián)系起來。信號和槽機制是使Qt運作的元素。第20頁,共110頁。信號(Signal)

8、與槽(Slot)初探 類似于windows中的消息和消息響應(yīng)都是通過C+類成員函數(shù)實現(xiàn)的信號和槽是通過連接實現(xiàn)相互關(guān)聯(lián)的包含信號或槽的類必須從QObject繼承第21頁,共110頁。信號(Signal)與槽(Slot)初探emit clicked();第22頁,共110頁。信號(Signal)與槽(Slot)初探private slots: void on_addButton_clicked(); void on_deleteButton_clicked();connect(clearButton,SIGNAL(clicked(),listWidget,SLOT(clear();connect

9、(addButton,SIGNAL(clicked(),this,SLOT(.);2xclear();第23頁,共110頁。信號(Signal)與槽(Slot)初探 . emit clicked(); . . emit clicked(); . . emit clicked(); . QString newText = QInputDialog:getText(this, Enter text, Text:); if( !newText.isEmpty() ) ui-listWidget-addItem(newText); foreach (QListWidgetItem *item, ui-

10、listWidget-selectedItems() delete item; clear();第24頁,共110頁。信號(Signal)與槽(Slot)初探class Employee : public QObjectQ_OBJECTpublic:Employee();int salary() const;public slots:void setSalary(int newSalary);signals:void salaryChanged(int newSalary);private:int mySalary;emit salaryChanged(50);信號和槽的聲明:第25頁,共11

11、0頁。信號(Signal)與槽(Slot)初探第26頁,共110頁。信號(Signal)與槽(Slot)初探 信號與槽機制只能用在繼承于QObject的類。槽可以返回值,但通過聯(lián)接返回時不能有返回值,槽以一個普通的函數(shù)實現(xiàn),可以作為普通函數(shù)調(diào)用。信號總是返回空,信號總是不必實現(xiàn) 一個信號可以連接到多個槽,但槽的調(diào)用順序不確定。 信號和槽需要具有相同的參數(shù)列表;如果信號的參數(shù)比槽多,那么多余的參數(shù)會被忽略;如果參數(shù)列表不匹配,Qt會產(chǎn)生運行時錯誤信息第27頁,共110頁。信號和槽 vs 回調(diào)回調(diào)(callback)是一個函數(shù)指針,當(dāng)一個事件發(fā)生時被調(diào)用,任何函數(shù)都可以被安排作為回調(diào)。沒有類型安全

12、總是以直接調(diào)用方式工作信號和槽的方式更加動態(tài)一個更通用的機制更容易互連兩個已存在的類相關(guān)類之間涉及更少的知識共享第28頁,共110頁。用戶界面設(shè)計用戶界面由特定的部件(widget)構(gòu)建第29頁,共110頁。用戶界面設(shè)計三種方式1.絕對定位(absolute positioning )最粗劣的方式對部件的大小、位置進行硬編碼2. 手工布局(manual layout)絕對位置,但通過resizeEvent()方法改變大小3.布局管理器(layout managers)部件放置在布局管理器中,使界面更具彈性。第30頁,共110頁。布局管理器的優(yōu)點?讓部件適應(yīng)內(nèi)容讓部件適應(yīng)翻譯變化讓部件適應(yīng)用戶設(shè)

13、置第31頁,共110頁。布局管理幾種可用的布局布局管理器和部件“協(xié)商”各個部件大小與位置彈簧可以用來填充空白處QGridLayoutQVBoxLayoutQHBoxLayout第32頁,共110頁。布局管理器示例對話框由多層的布局管理器和部件組成兩種方式:代碼實現(xiàn),使用設(shè)計器注意:布局管理器并不是其管理的部件的父對象第33頁,共110頁。布局管理器代碼實現(xiàn) QVBoxLayout *outerLayout = new QVBoxLayout(this); QHBoxLayout *topLayout = new QHBoxLayout(); topLayout-addWidget(new QL

14、abel(Printer:); topLayout-addWidget(c=new QComboBox(); outerLayout-addLayout(topLayout); QHBoxLayout *groupLayout = new QHBoxLayout(); . outerLayout-addLayout(groupLayout); outerLayout-addSpacerItem(new QSpacerItem(.); QHBoxLayout *buttonLayout = new QHBoxLayout(); buttonLayout-addSpacerItem(new QSp

15、acerItem(.); buttonLayout-addWidget(new QPushButton(Print); buttonLayout-addWidget(new QPushButton(Cancel); outerLayout-addLayout(buttonLayout);第34頁,共110頁。布局管理器代碼實現(xiàn) QVBoxLayout *outerLayout = new QVBoxLayout(this); QHBoxLayout *topLayout = new QHBoxLayout(); topLayout-addWidget(new QLabel(Printer:);

16、 topLayout-addWidget(c=new QComboBox(); outerLayout-addLayout(topLayout); QHBoxLayout *groupLayout = new QHBoxLayout(); . outerLayout-addLayout(groupLayout); outerLayout-addSpacerItem(new QSpacerItem(.); QHBoxLayout *buttonLayout = new QHBoxLayout(); buttonLayout-addSpacerItem(new QSpacerItem(.); bu

17、ttonLayout-addWidget(new QPushButton(Print); buttonLayout-addWidget(new QPushButton(Cancel); outerLayout-addLayout(buttonLayout);第35頁,共110頁。布局管理器代碼實現(xiàn) QVBoxLayout *outerLayout = new QVBoxLayout(this); QHBoxLayout *topLayout = new QHBoxLayout(); topLayout-addWidget(new QLabel(Printer:); topLayout-addW

18、idget(c=new QComboBox(); outerLayout-addLayout(topLayout); QHBoxLayout *groupLayout = new QHBoxLayout(); . outerLayout-addLayout(groupLayout); outerLayout-addSpacerItem(new QSpacerItem(.); QHBoxLayout *buttonLayout = new QHBoxLayout(); buttonLayout-addSpacerItem(new QSpacerItem(.); buttonLayout-addW

19、idget(new QPushButton(Print); buttonLayout-addWidget(new QPushButton(Cancel); outerLayout-addLayout(buttonLayout);第36頁,共110頁。布局管理器代碼實現(xiàn) QVBoxLayout *outerLayout = new QVBoxLayout(this); QHBoxLayout *topLayout = new QHBoxLayout(); topLayout-addWidget(new QLabel(Printer:); topLayout-addWidget(c=new QCo

20、mboBox(); outerLayout-addLayout(topLayout); QHBoxLayout *groupLayout = new QHBoxLayout(); . outerLayout-addLayout(groupLayout); outerLayout-addSpacerItem(new QSpacerItem(.); QHBoxLayout *buttonLayout = new QHBoxLayout(); buttonLayout-addSpacerItem(new QSpacerItem(.); buttonLayout-addWidget(new QPush

21、Button(Print); buttonLayout-addWidget(new QPushButton(Cancel); outerLayout-addLayout(buttonLayout);第37頁,共110頁。布局管理器代碼實現(xiàn) QVBoxLayout *outerLayout = new QVBoxLayout(this); QHBoxLayout *topLayout = new QHBoxLayout(); topLayout-addWidget(new QLabel(Printer:); topLayout-addWidget(c=new QComboBox(); outer

22、Layout-addLayout(topLayout); QHBoxLayout *groupLayout = new QHBoxLayout(); . outerLayout-addLayout(groupLayout); outerLayout-addSpacerItem(new QSpacerItem(.); QHBoxLayout *buttonLayout = new QHBoxLayout(); buttonLayout-addSpacerItem(new QSpacerItem(.); buttonLayout-addWidget(new QPushButton(Print);

23、buttonLayout-addWidget(new QPushButton(Cancel); outerLayout-addLayout(buttonLayout);第38頁,共110頁。布局管理器代碼實現(xiàn) QHBoxLayout *groupLayout = new QHBoxLayout(); QGroupBox *orientationGroup = new QGroupBox(); QVBoxLayout *orientationLayout = new QVBoxLayout(orientationGroup); orientationLayout-addWidget(new QR

24、adioButton(Landscape); orientationLayout-addWidget(new QRadioButton(Portrait); groupLayout-addWidget(orientationGroup); QGroupBox *colorGroup = new QGroupBox(); QVBoxLayout *colorLayout = new QVBoxLayout(colorGroup); colorLayout-addWidget(new QRadioButton(Black and White); colorLayout-addWidget(new

25、QRadioButton(Color); groupLayout-addWidget(colorGroup);Horizontal box, 包含 group boxes, vertical boxes, radio buttons第39頁,共110頁。布局管理器設(shè)計器可以使用設(shè)計器來建立同樣的結(jié)構(gòu)第40頁,共110頁。通用部件 Qt包含針對所有情形的大量通用部件; 第三方控件,如QWT 自定義控件第41頁,共110頁。尺寸(size)的策略布局管理器是在空間和其他布局管理器之間進行協(xié)調(diào)布局管理器提供布局結(jié)構(gòu)水平布局和垂直布局網(wǎng)格布局部件則提供各個方向上的尺寸策略最大和最小尺寸第42頁,共11

26、0頁。尺寸的策略例子未完成!printerList-setSizePolicy(QSizePolicy:Expanding, QSizePolicy:Fixed)第43頁,共110頁。尺寸的策略每一個widget有一個大小的示意,它給出了各個方向上尺寸的策略Fixed 規(guī)定了widget的尺寸Minimum 規(guī)定了可能的最小值Maximum 規(guī)定可能的最大值Preferred 給出最好的值但不是必須的Expanding 同preferred,但希望增長MinimumExpanding 同minimum,但希望增長Ignored 忽略規(guī)定尺寸, widget得到盡量大的空間第44頁,共110頁。

27、如果?2個 preferred 相鄰1個 preferred, 1個 expanding2個 expanding 相鄰空間不足以放置widget (fixed)第45頁,共110頁。關(guān)于尺寸的更多信息可用最大和最小屬性更好地控制widget的大小maximumSize 最大可能尺寸minimumSize 最小可能尺寸ui-pushButton-setMinimumSize(100, 150);ui-pushButton-setMaximumHeight(250);第46頁,共110頁。伸縮因子控制縮放時,各控件的縮放比例。第47頁,共110頁。設(shè)計器介紹以前設(shè)計器(Designer)是一個獨立

28、的工具,但現(xiàn)在是QtCreator的一個組成部分可視化窗體編輯器拖放部件安排布局進行信號連接第48頁,共110頁。設(shè)計器介紹sources*.cppexecutablesobject files*.oheaders*.hgeneratedmoc_*.cppuser interfaces*.uiincludescompileslinkscompilesmocs第49頁,共110頁。設(shè)計器介紹sources*.cppexecutablesobject files*.oheaders*.hgeneratedmoc_*.cppgeneratedui_*.huser interfaces*.uiincl

29、udescompileslinkscompilesmocsuic第50頁,共110頁。使用代碼#ifndef WIDGET_H#define WIDGET_H#include namespace Ui class Widget;class Widget : public QWidget Q_OBJECTpublic: Widget(QWidget *parent = 0); Widget();private: Ui:Widget *ui;#endif / WIDGET_HUi:Widget類的前置聲明一個 Ui:Widget 類指針ui ,指向所有部件基本上一個標(biāo)準(zhǔn)的 QWidget 派生類第

30、51頁,共110頁。使用代碼#include widget.h#include ui_widget.hWidget:Widget(QWidget *parent) : QWidget(parent), ui(new Ui:Widget) ui-setupUi(this);Widget:Widget() delete ui;實例化類Ui:Widget 為 ui刪除 ui對象調(diào)用函數(shù) setupUi, 生成所有父窗體 (this)的子窗體部件第52頁,共110頁。使用設(shè)計器基本工作流程粗略地放置部件在窗體上從里到外進行布局,添加必要的彈簧進行信號連接在代碼中使用在整個過程中不斷修改編輯屬性實踐創(chuàng)造

31、完美!第53頁,共110頁。使用設(shè)計器拖放部件粗略地放置部件在窗體上第54頁,共110頁。使用設(shè)計器從里到外進行布局,添加必要的彈簧121. 選中每一個 group box, 2. 應(yīng)用垂直布局管理第55頁,共110頁。使用設(shè)計器從里到外進行布局,添加必要的彈簧11. 選中l(wèi)abel (click), 2. 選中combobox (Ctrl+click)2第56頁,共110頁。使用設(shè)計器從里到外進行布局,添加必要的彈簧11. 應(yīng)用一個水平布局管理第57頁,共110頁。使用設(shè)計器從里到外進行布局,添加必要的彈簧131. 選中2個group box并進行布局管理, 2. 添加一個水平彈簧, 3.

32、將彈簧和按鈕放置進一個布局管理中2第58頁,共110頁。使用設(shè)計器進行信號連接(部件之間)12341. 轉(zhuǎn)到signals and slot 編輯模式, 2. 從一個部件拖放鼠標(biāo)到另一個部件, 3. 選中signal and slot, 4. 在connections dock中查看結(jié)果第59頁,共110頁。使用設(shè)計器進行信號連接(到你的代碼中)1231. 在widget editing 模式中 2. 右擊一個部件并選擇 Go to slot.3. 選擇一個信號來連接到你的代碼第60頁,共110頁。使用設(shè)計器在代碼中使用通過ui類成員使用所有部件class Widget : public QW

33、idget .private: Ui:Widget *ui;void Widget:memberFunction() ui-pushButton-setText(.);第61頁,共110頁。界面美化1.子類化已有的控件類,重新實現(xiàn)paintEvent()、MouseEvent()等方法;2.子類化QStyle,或者使用已經(jīng)定義了的QWindowStyle等。3.使用StyleSheet。第62頁,共110頁。樣式表(StyleSheet)所有的 QWidget 類都有一個 styleSheet 屬性以支持跨平臺樣式樣式表是受啟發(fā)自CSS的它們可以用來進行高亮處理并進行許多小的修改當(dāng)然也可以用于

34、用戶界面的整體修改第63頁,共110頁。樣式表為一個單獨的部件應(yīng)用一個樣式表的最簡單方法是用設(shè)計器第64頁,共110頁。樣式表想為整個應(yīng)用程序設(shè)定樣式,可以使用 QApplication:setStyleSheetQLineEdit background-color: yellow QLineEdit#nameEdit background-color: yellow QTextEdit, QListView background-color: white; background-image: url(draft.png); background-attachment: scroll; QGr

35、oupBox background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #E0E0E0, stop: 1 #FFFFFF); border: 2px solid gray; border-radius: 5px; margin-top: 1ex; 使用圖片在Designer的編輯器中建立這些選擇一個類通過對象名選擇一個對象第65頁,共110頁。資源文件(qrc)將圖標(biāo)放進一個資源文件中,Qt會將它們內(nèi)嵌進可執(zhí)行文件避免調(diào)用多文件不需要嘗試確定每個特定安裝風(fēng)格下的圖標(biāo)的路徑一切都巧妙地在軟件構(gòu)建系統(tǒng)中自適應(yīng)避免部署

36、的時候出現(xiàn)文件丟失的錯誤可以將任何東西添加進資源文件中,不僅僅是圖標(biāo),但一般是不需要修改的文件。第66頁,共110頁。資源文件(qrc)可以輕松的在QtCreator中管理資源文件在路徑和文件名前添加 : 以使用資源或者簡單地在設(shè)計器的列表中選擇一個圖標(biāo)QPixmap pm(:/images/logo.png);第67頁,共110頁。Qt的國際化1. 確保應(yīng)用程序是可翻譯的: 所用用戶可見的字符串都使用tr()修飾 根據(jù)不同的目標(biāo)語言加載不同的qm的文件。2. 即使應(yīng)用程序目前不需要翻譯,也應(yīng)該為以后的需求留出余地。第68頁,共110頁。Qt國際化步驟1.在代碼中使用tr()修飾用戶可見的字符

37、串;2.lupdate提取需要翻譯的字符串;TRANSLATIONS = spreadsheet_cn.ts spreadsheet_en.ts 3.使用linguist工具翻譯;4.在程序開始時加載正確的qm文件。第69頁,共110頁。Qt國際化加載qm文件int main(int argc, char *argv) QApplication app(argc, argv); . QTranslator appTranslator; appTranslator.load(myapp_ + QLocale:system().name(), qmPath); app.installTransla

38、tor(&appTranslator); . return app.exec(); 第70頁,共110頁。Qt國際化動態(tài)語言切換額外的工作:語言切換的途徑(菜單、按鈕等);在統(tǒng)一的方法(RetranslateUI()內(nèi)處理用戶可見字符串,并在語言切換時調(diào)用該方法。實現(xiàn)changeEvent(QEvent *event) 方法void JournalView:changeEvent(QEvent *event) if (event-type() = QEvent:LanguageChange) retranslateUi(); QTableWidget:changeEvent(event); 第

39、71頁,共110頁。Qt簡介Qt的使用Qt深入理解Qt的應(yīng)用第72頁,共110頁。QObject類QObject是幾乎所有Qt類和所有部件(widget)的基類。它包含很多組成Qt的機制事件信號和槽屬性內(nèi)存管理第73頁,共110頁。QObject類QObject 是大部分Qt 類的基類例外的例子是:類需要作為輕量級的類,例如圖元(graphical primitives)-QPen、QBrush。數(shù)據(jù)容器(QString, QList, QChar等)需要可復(fù)制的類,因為QObject類是無法被復(fù)制的。第74頁,共110頁。QObject類它們可以擁有一個名字 (QObject:objectN

40、ame)addButton, lineEdit_Password.它們被放置在QObject實例的一個層次上它們可以有到其他 QObject 實例的聯(lián)接“QObject 的實例是單獨的!”第75頁,共110頁。對象數(shù)據(jù)存儲(1) class Personprivate: string mszName; / 姓名 bool mbSex; / 性別 int mnAge; / 年齡;c+中定義數(shù)據(jù)變量的一般方法:第76頁,共110頁。/ File name: person.h/ 聲明私有數(shù)據(jù)成員類型struct PersonalDataPrivate; class Personpublic: Per

41、son (); / constructorvirtual Person (); / destructorvoid setAge(const int);int getAge();private: PersonalDataPrivate* d;對象數(shù)據(jù)存儲(2) Qt定義數(shù)據(jù)變量(Qt 2.x):/ File name: person.cppstruct PersonalDataPrivate / 定義私有數(shù)據(jù)成員類型 string mszName; / 姓名 bool mbSex; / 性別 int mnAge; / 年齡;/ constructorPerson:Person () d = ne

42、w PersonalDataPrivate;/ destructorPerson:Person () delete d;void Person:setAge(const int age) if (age != d-mnAge) d-mnAge = age;int Person:getAge() return d-mnAge;第77頁,共110頁。元對象系統(tǒng)(Meta-Object System) QObject 類 作為每一個需要利用元對象系統(tǒng)的類的基類。Q_OBJECT 宏, 定義在每一個類的私有數(shù)據(jù)段,用來啟用元對象功能,比如,動態(tài)屬性,信號和槽。元對象編譯器moc (the Meta O

43、bject Complier)第78頁,共110頁。元對象系統(tǒng)(Meta-Object System)元對象系統(tǒng)的功能:元數(shù)據(jù)(QObject:metaObject)類名 (QObject:className)繼承 (QObject:inherits)屬性(setProperty和 QObject:property)信號和槽(Signal and slot)普通信息(QObject:classInfo)國際化(tr(), QObject:trUtf8()第79頁,共110頁。元對象系統(tǒng)(Meta-Object System)sources*.cppexecutablesobject files

44、*.oheaders*.h普通的C+生成過程includescompileslinks第80頁,共110頁。元數(shù)據(jù)通過元對象編譯器(moc)在編譯時組合在一起,元對象編譯器用來處理Qt 的C+擴展。 moc從頭文件里面獲得數(shù)據(jù)。sources*.cppexecutablesobject files*.oheaders*.hgeneratedmoc_*.cppQt C+ 生成過程includescompileslinkscompilesmocs元對象系統(tǒng)(Meta-Object System)第81頁,共110頁。元數(shù)據(jù)moc 找什么?class MyClass : public QObject

45、 Q_OBJECT Q_CLASSINFO(author, John Doe)public: MyClass(const Foo &foo, QObject *parent=0); Foo foo() const;public slots: void setFoo( const Foo &foo );signals: void fooChanged( Foo );private: Foo m_foo;Qt 關(guān)鍵字類的一般信息 Q_OBJECT宏, 通常是第一步首先確認(rèn)該類繼承自 Qobject (可能是間接)第82頁,共110頁。內(nèi)省(Introspection)類在運行時了解它們自己的信息對

46、實現(xiàn)腳本和動態(tài)語言的綁定 有很好的支持。if (object-inherits(QAbstractItemView) QAbstractItemView *view = static_cast(widget); view-.enum CapitalsEnum Oslo, Helsinki, Stockholm, Copenhagen ;int index = object-metaObject()-indexOfEnumerator(CapitalsEnum);object-metaObject()-enumerator(index)-key(object-capital();能夠?qū)崿F(xiàn)動態(tài)轉(zhuǎn)換

47、而不需要運行時類型檢查( RTTI)例子:它可以將枚舉值轉(zhuǎn)換成更容易閱讀和保存的字符串元對象了解細(xì)節(jié)第83頁,共110頁。屬性(Properties)QObject有g(shù)etter和setter函數(shù)屬性命名策略: color, setColor對于布爾: isEnabled, setEnabledclass QLabel : public QFrame Q_OBJECT Q_PROPERTY(QString text READ text WRITE setText)public: QString text() const;public slots: void setText(const QStr

48、ing &);Setter, 返回空,將值當(dāng)成唯一參數(shù)Getter, 常量,返回值,沒有參數(shù)第84頁,共110頁。屬性為什么使用setter 函數(shù)?可以驗證設(shè)置對可能的變化作出反應(yīng)void setMin( int newMin ) if( newMin m_max ) qWarning(Ignoring setMin(%d) as min max., newMin); return; .void setMin( int newMin ) . m_min = newMin; updateMinimum();第85頁,共110頁。屬性Properties為什么使用getter 函數(shù)?間接的屬性QS

49、ize size() const return m_size;int width() const return m_size.width();第86頁,共110頁。屬性 Q_PROPERTY(type name READ getFunction WRITE setFunction RESET resetFunction NOTIFY notifySignal DESIGNABLE bool SCRIPTABLE bool STORED bool USER bool CONSTANT FINAL)第87頁,共110頁。使用屬性直接獲取通過元信息和屬性系統(tǒng)在運行時發(fā)現(xiàn)屬性QString text

50、= label-text();label-setText(Hello World!);QString text = object-property(text).toString();object-setProperty(text, Hello World);int QMetaObject:propertyCount();QMetaProperty QMetaObject:property(i);QMetaProperty:name/isConstant/isDesignable/read/write/.第88頁,共110頁。動態(tài)屬性在運行時給對象增加屬性可以用來“標(biāo)識”對象,等等。bool r

51、et = object-setProperty(name, value);QObject:dynamicPropertyNames() const真:如果屬性經(jīng)過Q_PROPERTY 定義 假:如果只是動態(tài)增加返回一個動態(tài)屬性的列表第89頁,共110頁。創(chuàng)建自定義屬性class AngleObject : public QObject Q_OBJECT Q_PROPERTY(qreal angle READ angle WRITE setAngle)public: AngleObject(qreal angle, QObject *parent = 0); qreal angle() cons

52、t; void setAngle(qreal);private: qreal m_angle;宏,描述屬性初始化值GetterSetter私有狀態(tài)第90頁,共110頁。創(chuàng)建自定義屬性AngleObject:AngleObject(qreal angle, QObject *parent) : QObject(parent), m_angle(angle)qreal AngleObject:angle() const return m_angle;void AngleObject:setAngle(qreal angle) m_angle = angle; doSomething();初始化值G

53、etter 簡單返回值。這里你可以計算復(fù)雜的值。更新內(nèi)部狀態(tài), 對變化作出反應(yīng)。第91頁,共110頁。自定義屬性 - 枚舉class AngleObject : public QObject Q_OBJECT Q_ENUMS(AngleMode) Q_PROPERTY(AngleMode angleMode READ .)public: enum AngleMode Radians, Degrees; .;普通枚舉聲明。宏通知Qt AngleMode 是一個枚舉類型。屬性使用枚舉作為類型。第92頁,共110頁。內(nèi)存管理QObject 可以有父對象和子對象當(dāng)一個父對象被刪除,它的子對象也同樣被刪

54、除。QObject *parent = new QObject();QObject *child1 = new QObject(parent);QObject *child2 = new QObject(parent);QObject *child1_1 = new QObject(child1);QObject *child1_2 = new QObject(child1);delete parent;parentchild1child2child1_1child1_2parent 刪除 child1 和 child2child1 刪除 child1_1 和 child1_2第93頁,共11

55、0頁。內(nèi)存管理當(dāng)需要實現(xiàn)視覺層級時使用到它。QDialog *parent = new QDialog();QGroupBox *box = new QGroupBox(parent);QPushButton *button = new QPushButton(parent);QRadioButton *option1 = new QRadioButton(box);QRadioButton *option2 = new QRadioButton(box);delete parent;parent 刪除 box 和 buttonbox 刪除 option1 和 option2第94頁,共110頁。使用方法使用 this指針指向最高層父對象在棧上分配父對象空間void Widget:showDialog() Dialog dialog; if (dialog.exec() = QDialog:Accepted) . Dialog

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論