




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、.Qt入門培訓Qt introduction 第1頁,共110頁。Qt簡介Qt的使用Qt深入理解Qt的應用第2頁,共110頁。Qt簡介什么是Qt?第3頁,共110頁。什么是Qt?原來用作用戶界面開發,現可用作所有的開發例如:Databases, XML, WebKit, multimedia, networking, OpenGL, scripting, non-GUI.”Qt 是一個用C+編寫的跨平臺開發框架.”第4頁,共110頁。什么是Qt?Qt由模塊構建QtCorePhononQtXmlPatternsQtXmlQtWebKitQtSvgQtSqlQtScriptQtOpenVGQtOp
2、enGLQtNetworkQtMultimediaQtGui第5頁,共110頁。什么是QT?Qt用宏(macros)和內省(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的目的一次編寫,到處編譯根據不同平臺的本地觀感生成相應的本地應用簡
3、單地使用API,高開發效率,開放性,使用有趣第7頁,共110頁。Qt的歷史19901991199419992001Haavard 和Eirik靈感閃現開始設計,并提出信號和槽的概念1993開發出Qt的第一個圖形核心命名為Qt,并建立“奇趣科技”1995簽訂第一個合同,開始快速發展。1997Qt1.2發布, 并且用于開發KDE。Qt 2.0發布Qt 3.0發布。2005Qt 4.0發布2008Nokia收購奇趣科技第8頁,共110頁。Qt的跨平臺桌面平臺WindowsMac OS XLinux/Unix X11第9頁,共110頁。Qt的跨平臺嵌入式平臺Windows CESymbianMaemo
4、嵌入式Linux第10頁,共110頁。Qt的授權LGPL 免費你的應用程序可以是開源的或者是不開源的對Qt的修改,必須反饋到社區GPL 免費你的應用程序必須是開源的對Qt的修改,必須反饋到社區商業的 收費你的應用程序可以是不開源 的對Qt的修改,可以不開源第11頁,共110頁。Qt簡介Qt的使用Qt深入理解Qt的應用第12頁,共110頁。Qt的代碼結構-Hello World第13頁,共110頁。Qt的代碼結構-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的代碼結構-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的代碼結構-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的代碼結構-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的代碼結構-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開發工具集Qt CreatorQt DesignerQt LinguistQt AssisantQt Demos第19頁,共110頁。信號(Signal)與槽(Slot)初探QT提供的一種在對象間進行通訊的技術。動態地或松散地將事件和狀態變化聯系起來。信號和槽機制是使Qt運作的元素。第20頁,共110頁。信號(Signal)
8、與槽(Slot)初探 類似于windows中的消息和消息響應都是通過C+類成員函數實現的信號和槽是通過連接實現相互關聯的包含信號或槽的類必須從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的類。槽可以返回值,但通過聯接返回時不能有返回值,槽以一個普通的函數實現,可以作為普通函數調用。信號總是返回空,信號總是不必實現 一個信號可以連接到多個槽,但槽的調用順序不確定。 信號和槽需要具有相同的參數列表;如果信號的參數比槽多,那么多余的參數會被忽略;如果參數列表不匹配,Qt會產生運行時錯誤信息第27頁,共110頁。信號和槽 vs 回調回調(callback)是一個函數指針,當一個事件發生時被調用,任何函數都可以被安排作為回調。沒有類型安全
12、總是以直接調用方式工作信號和槽的方式更加動態一個更通用的機制更容易互連兩個已存在的類相關類之間涉及更少的知識共享第28頁,共110頁。用戶界面設計用戶界面由特定的部件(widget)構建第29頁,共110頁。用戶界面設計三種方式1.絕對定位(absolute positioning )最粗劣的方式對部件的大小、位置進行硬編碼2. 手工布局(manual layout)絕對位置,但通過resizeEvent()方法改變大小3.布局管理器(layout managers)部件放置在布局管理器中,使界面更具彈性。第30頁,共110頁。布局管理器的優點?讓部件適應內容讓部件適應翻譯變化讓部件適應用戶設
13、置第31頁,共110頁。布局管理幾種可用的布局布局管理器和部件“協商”各個部件大小與位置彈簧可以用來填充空白處QGridLayoutQVBoxLayoutQHBoxLayout第32頁,共110頁。布局管理器示例對話框由多層的布局管理器和部件組成兩種方式:代碼實現,使用設計器注意:布局管理器并不是其管理的部件的父對象第33頁,共110頁。布局管理器代碼實現 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頁。布局管理器代碼實現 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頁。布局管理器代碼實現 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頁。布局管理器代碼實現 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頁。布局管理器代碼實現 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頁。布局管理器代碼實現 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頁。布局管理器設計器可以使用設計器來建立同樣的結構第40頁,共110頁。通用部件 Qt包含針對所有情形的大量通用部件; 第三方控件,如QWT 自定義控件第41頁,共110頁。尺寸(size)的策略布局管理器是在空間和其他布局管理器之間進行協調布局管理器提供布局結構水平布局和垂直布局網格布局部件則提供各個方向上的尺寸策略最大和最小尺寸第42頁,共11
26、0頁。尺寸的策略例子未完成!printerList-setSizePolicy(QSizePolicy:Expanding, QSizePolicy:Fixed)第43頁,共110頁。尺寸的策略每一個widget有一個大小的示意,它給出了各個方向上尺寸的策略Fixed 規定了widget的尺寸Minimum 規定了可能的最小值Maximum 規定可能的最大值Preferred 給出最好的值但不是必須的Expanding 同preferred,但希望增長MinimumExpanding 同minimum,但希望增長Ignored 忽略規定尺寸, widget得到盡量大的空間第44頁,共110頁。
27、如果?2個 preferred 相鄰1個 preferred, 1個 expanding2個 expanding 相鄰空間不足以放置widget (fixed)第45頁,共110頁。關于尺寸的更多信息可用最大和最小屬性更好地控制widget的大小maximumSize 最大可能尺寸minimumSize 最小可能尺寸ui-pushButton-setMinimumSize(100, 150);ui-pushButton-setMaximumHeight(250);第46頁,共110頁。伸縮因子控制縮放時,各控件的縮放比例。第47頁,共110頁。設計器介紹以前設計器(Designer)是一個獨立
28、的工具,但現在是QtCreator的一個組成部分可視化窗體編輯器拖放部件安排布局進行信號連接第48頁,共110頁。設計器介紹sources*.cppexecutablesobject files*.oheaders*.hgeneratedmoc_*.cppuser interfaces*.uiincludescompileslinkscompilesmocs第49頁,共110頁。設計器介紹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 ,指向所有部件基本上一個標準的 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對象調用函數 setupUi, 生成所有父窗體 (this)的子窗體部件第52頁,共110頁。使用設計器基本工作流程粗略地放置部件在窗體上從里到外進行布局,添加必要的彈簧進行信號連接在代碼中使用在整個過程中不斷修改編輯屬性實踐創造
31、完美!第53頁,共110頁。使用設計器拖放部件粗略地放置部件在窗體上第54頁,共110頁。使用設計器從里到外進行布局,添加必要的彈簧121. 選中每一個 group box, 2. 應用垂直布局管理第55頁,共110頁。使用設計器從里到外進行布局,添加必要的彈簧11. 選中label (click), 2. 選中combobox (Ctrl+click)2第56頁,共110頁。使用設計器從里到外進行布局,添加必要的彈簧11. 應用一個水平布局管理第57頁,共110頁。使用設計器從里到外進行布局,添加必要的彈簧131. 選中2個group box并進行布局管理, 2. 添加一個水平彈簧, 3.
32、將彈簧和按鈕放置進一個布局管理中2第58頁,共110頁。使用設計器進行信號連接(部件之間)12341. 轉到signals and slot 編輯模式, 2. 從一個部件拖放鼠標到另一個部件, 3. 選中signal and slot, 4. 在connections dock中查看結果第59頁,共110頁。使用設計器進行信號連接(到你的代碼中)1231. 在widget editing 模式中 2. 右擊一個部件并選擇 Go to slot.3. 選擇一個信號來連接到你的代碼第60頁,共110頁。使用設計器在代碼中使用通過ui類成員使用所有部件class Widget : public QW
33、idget .private: Ui:Widget *ui;void Widget:memberFunction() ui-pushButton-setText(.);第61頁,共110頁。界面美化1.子類化已有的控件類,重新實現paintEvent()、MouseEvent()等方法;2.子類化QStyle,或者使用已經定義了的QWindowStyle等。3.使用StyleSheet。第62頁,共110頁。樣式表(StyleSheet)所有的 QWidget 類都有一個 styleSheet 屬性以支持跨平臺樣式樣式表是受啟發自CSS的它們可以用來進行高亮處理并進行許多小的修改當然也可以用于
34、用戶界面的整體修改第63頁,共110頁。樣式表為一個單獨的部件應用一個樣式表的最簡單方法是用設計器第64頁,共110頁。樣式表想為整個應用程序設定樣式,可以使用 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)將圖標放進一個資源文件中,Qt會將它們內嵌進可執行文件避免調用多文件不需要嘗試確定每個特定安裝風格下的圖標的路徑一切都巧妙地在軟件構建系統中自適應避免部署
36、的時候出現文件丟失的錯誤可以將任何東西添加進資源文件中,不僅僅是圖標,但一般是不需要修改的文件。第66頁,共110頁。資源文件(qrc)可以輕松的在QtCreator中管理資源文件在路徑和文件名前添加 : 以使用資源或者簡單地在設計器的列表中選擇一個圖標QPixmap pm(:/images/logo.png);第67頁,共110頁。Qt的國際化1. 確保應用程序是可翻譯的: 所用用戶可見的字符串都使用tr()修飾 根據不同的目標語言加載不同的qm的文件。2. 即使應用程序目前不需要翻譯,也應該為以后的需求留出余地。第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國際化動態語言切換額外的工作:語言切換的途徑(菜單、按鈕等);在統一的方法(RetranslateUI()內處理用戶可見字符串,并在語言切換時調用該方法。實現changeEvent(QEvent *event) 方法void JournalView:changeEvent(QEvent *event) if (event-type() = QEvent:LanguageChange) retranslateUi(); QTableWidget:changeEvent(event); 第
39、71頁,共110頁。Qt簡介Qt的使用Qt深入理解Qt的應用第72頁,共110頁。QObject類QObject是幾乎所有Qt類和所有部件(widget)的基類。它包含很多組成Qt的機制事件信號和槽屬性內存管理第73頁,共110頁。QObject類QObject 是大部分Qt 類的基類例外的例子是:類需要作為輕量級的類,例如圖元(graphical primitives)-QPen、QBrush。數據容器(QString, QList, QChar等)需要可復制的類,因為QObject類是無法被復制的。第74頁,共110頁。QObject類它們可以擁有一個名字 (QObject:objectN
40、ame)addButton, lineEdit_Password.它們被放置在QObject實例的一個層次上它們可以有到其他 QObject 實例的聯接“QObject 的實例是單獨的!”第75頁,共110頁。對象數據存儲(1) class Personprivate: string mszName; / 姓名 bool mbSex; / 性別 int mnAge; / 年齡;c+中定義數據變量的一般方法:第76頁,共110頁。/ File name: person.h/ 聲明私有數據成員類型struct PersonalDataPrivate; class Personpublic: Per
41、son (); / constructorvirtual Person (); / destructorvoid setAge(const int);int getAge();private: PersonalDataPrivate* d;對象數據存儲(2) Qt定義數據變量(Qt 2.x):/ File name: person.cppstruct PersonalDataPrivate / 定義私有數據成員類型 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頁。元對象系統(Meta-Object System) QObject 類 作為每一個需要利用元對象系統的類的基類。Q_OBJECT 宏, 定義在每一個類的私有數據段,用來啟用元對象功能,比如,動態屬性,信號和槽。元對象編譯器moc (the Meta O
43、bject Complier)第78頁,共110頁。元對象系統(Meta-Object System)元對象系統的功能:元數據(QObject:metaObject)類名 (QObject:className)繼承 (QObject:inherits)屬性(setProperty和 QObject:property)信號和槽(Signal and slot)普通信息(QObject:classInfo)國際化(tr(), QObject:trUtf8()第79頁,共110頁。元對象系統(Meta-Object System)sources*.cppexecutablesobject files
44、*.oheaders*.h普通的C+生成過程includescompileslinks第80頁,共110頁。元數據通過元對象編譯器(moc)在編譯時組合在一起,元對象編譯器用來處理Qt 的C+擴展。 moc從頭文件里面獲得數據。sources*.cppexecutablesobject files*.oheaders*.hgeneratedmoc_*.cppQt C+ 生成過程includescompileslinkscompilesmocs元對象系統(Meta-Object System)第81頁,共110頁。元數據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 關鍵字類的一般信息 Q_OBJECT宏, 通常是第一步首先確認該類繼承自 Qobject (可能是間接)第82頁,共110頁。內省(Introspection)類在運行時了解它們自己的信息對
46、實現腳本和動態語言的綁定 有很好的支持。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();能夠實現動態轉換
47、而不需要運行時類型檢查( RTTI)例子:它可以將枚舉值轉換成更容易閱讀和保存的字符串元對象了解細節第83頁,共110頁。屬性(Properties)QObject有getter和setter函數屬性命名策略: 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, 返回空,將值當成唯一參數Getter, 常量,返回值,沒有參數第84頁,共110頁。屬性為什么使用setter 函數?可以驗證設置對可能的變化作出反應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 函數?間接的屬性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頁。使用屬性直接獲取通過元信息和屬性系統在運行時發現屬性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頁。動態屬性在運行時給對象增加屬性可以用來“標識”對象,等等。bool r
51、et = object-setProperty(name, value);QObject:dynamicPropertyNames() const真:如果屬性經過Q_PROPERTY 定義 假:如果只是動態增加返回一個動態屬性的列表第89頁,共110頁。創建自定義屬性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私有狀態第90頁,共110頁。創建自定義屬性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 簡單返回值。這里你可以計算復雜的值。更新內部狀態, 對變化作出反應。第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頁。內存管理QObject 可以有父對象和子對象當一個父對象被刪除,它的子對象也同樣被刪
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頁。內存管理當需要實現視覺層級時使用到它。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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 退休人員上崗協議書
- 聘請合唱老師協議書
- 雙方風險承擔協議書
- 活動承辦意向協議書
- 物品保用協議書范本
- 農村繼承協議書范本
- 手工合作加工協議書
- 勞動事故私了協議書
- 家庭家產分配協議書
- 貨款協議書范本簡單
- (2023)四年級科學質量監測試題
- 自然常數e的意義與計算
- 農村土地延包確權實施方案
- 糖尿病眼部護理課件
- (課件)文題5【鄉情】
- 如何培養嚴重精神障礙患者的社交技能和人際交往能力
- 護工病房護理培訓:針對病房環境中的護理工作的專項培訓課件
- 健康生活從個人衛生做起
- 中小學科普講座《水與人類生活》公開課教案教學設計課件案例測試練習卷題
- 消化內科病房的醫院感染預防與控制
- 【提高酒店服務質量的思考:以S酒店為例4700字(論文)】
評論
0/150
提交評論