lect01Qt信號(hào)槽_第1頁
lect01Qt信號(hào)槽_第2頁
lect01Qt信號(hào)槽_第3頁
lect01Qt信號(hào)槽_第4頁
lect01Qt信號(hào)槽_第5頁
已閱讀5頁,還剩93頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、1helloworldhello qt (1)#include #include int main(int argc, char *argv) qapplication app(argc, argv); qlabel *label = new qlabel(hello qt!); label-show(); return app.exec();2hello qt (2): 用用html格式化格式化#include int main(int argc, char *argv) qapplication app(argc, argv); qlabel *label = new qlabel(hel

2、lo qt!); label-show(); return app.exec();34qt編譯過程qt編譯過程編譯過程 方法一:直接通過方法一:直接通過qt ideqt ide(qt creatorqt creator)界面直)界面直接編譯接編譯 方法二:命令行編譯方法二:命令行編譯執(zhí)行執(zhí)行“qmake -project”qmake -project” 創(chuàng)建創(chuàng)建 qt qt 工程文件工程文件(.pro)(.pro),該工程文件也可以手動(dòng)創(chuàng)建,該工程文件也可以手動(dòng)創(chuàng)建執(zhí)行執(zhí)行“qmake”qmake” 缺省輸入為工程文件,產(chǎn)生平臺(tái)相關(guān)的缺省輸入為工程文件,產(chǎn)生平臺(tái)相關(guān)的 makefile(s)m

3、akefile(s) 產(chǎn)生編譯規(guī)則,為工程中包含有產(chǎn)生編譯規(guī)則,為工程中包含有 q_object q_object 宏的頭文件調(diào)用宏的頭文件調(diào)用 moc moc 編譯器編譯器執(zhí)行執(zhí)行“make”make” 編譯程序編譯程序 執(zhí)行執(zhí)行moc, uicmoc, uic和和rccrcc5qt編譯工具:編譯工具:moc, uic 和和 rcc moc, moc, 元對(duì)象(元對(duì)象(meta-object compilermeta-object compiler)編譯器)編譯器對(duì)每一個(gè)類的對(duì)每一個(gè)類的頭文件頭文件,產(chǎn)生一個(gè)特殊的,產(chǎn)生一個(gè)特殊的 meta-meta-objectobjectmeta-obj

4、ect meta-object 由由 qt qt 使用使用 uic, uiuic, ui編譯器編譯器根據(jù)根據(jù)qt designerqt designer產(chǎn)生的產(chǎn)生的xmlxml文件文件(.ui)(.ui)生成對(duì)應(yīng)的頭生成對(duì)應(yīng)的頭文件代碼文件代碼 rcc, rcc, 資源編譯器資源編譯器生成包含生成包含qtqt資源文件資源文件(.qrc)(.qrc)中數(shù)據(jù)中數(shù)據(jù)( (如工具欄圖標(biāo)等如工具欄圖標(biāo)等) )的的c+c+源文件源文件 這些工具在編譯的時(shí)候由這些工具在編譯的時(shí)候由makefilemakefile管理,自動(dòng)管理,自動(dòng)運(yùn)行運(yùn)行67qt應(yīng)用程序執(zhí)行過程8qt應(yīng)用程序執(zhí)行過程應(yīng)用程序執(zhí)行過程事件驅(qū)

5、動(dòng)事件驅(qū)動(dòng) 初始化 處理事件 結(jié)束qt應(yīng)用程序qt 庫請(qǐng)求隊(duì)列事件隊(duì)列x server設(shè)備相關(guān)層計(jì)算機(jī)鍵盤鼠標(biāo)屏幕qt事件處理事件處理 在在x x程序中,敲擊鍵盤,鼠標(biāo)指針在窗口中的移程序中,敲擊鍵盤,鼠標(biāo)指針在窗口中的移動(dòng)或鼠標(biāo)按鍵動(dòng)作等,都是事件動(dòng)或鼠標(biāo)按鍵動(dòng)作等,都是事件 qtqt事件的處理過程事件的處理過程qapplicationqapplication的事件循環(huán)體從事件隊(duì)列中拾取本地的事件循環(huán)體從事件隊(duì)列中拾取本地窗口系統(tǒng)事件或其他事件窗口系統(tǒng)事件或其他事件譯成譯成qeventqevent,并送給,并送給qobject:event()qobject:event(),最后送給,最后送給

6、qwidget:event()qwidget:event()分別對(duì)事件處理分別對(duì)事件處理9qt事件處理(續(xù))事件處理(續(xù))qapplicationqwidget:event() qeventqobject:event()y 等待事件 讀取事件 檢查事件類型 處理事件 退出事件處理循環(huán)事件處理循環(huán)部分n1011qt程序要素和主要基類主要基類:主要基類:qobject類類 qt對(duì)象模型的核心對(duì)象模型的核心 qobject類類 qobject在整個(gè)在整個(gè)qt的體系中處于一個(gè)非常重要的位置的體系中處于一個(gè)非常重要的位置 是幾乎所有是幾乎所有qt類和所有部件類和所有部件(widget)的基類的基類 所有

7、的所有的qwidgets都是都是qobject 提供對(duì)象樹和對(duì)象的關(guān)系提供對(duì)象樹和對(duì)象的關(guān)系 提供了信號(hào)提供了信號(hào)-槽的通信機(jī)制槽的通信機(jī)制 對(duì)象不允許拷貝(禁用拷貝構(gòu)造函數(shù))對(duì)象不允許拷貝(禁用拷貝構(gòu)造函數(shù)) 包含了很多組成包含了很多組成qt的機(jī)制的機(jī)制 事件處理事件處理 屬性,內(nèi)省(屬性,內(nèi)?。╥ntrospection) 內(nèi)存管理內(nèi)存管理12qapplication類類 qapplication類負(fù)責(zé)類負(fù)責(zé)gui應(yīng)用程序的控制流和應(yīng)用程序的控制流和主要的設(shè)置,包括:主要的設(shè)置,包括: 主事件循環(huán)體,負(fù)責(zé)處理和調(diào)度所有來自窗口系統(tǒng)主事件循環(huán)體,負(fù)責(zé)處理和調(diào)度所有來自窗口系統(tǒng)和其他資源的事件

8、和其他資源的事件 處理應(yīng)用程序的開始、結(jié)束以及會(huì)話管理處理應(yīng)用程序的開始、結(jié)束以及會(huì)話管理 還包括系統(tǒng)和應(yīng)用程序方面的設(shè)置還包括系統(tǒng)和應(yīng)用程序方面的設(shè)置 在在qt應(yīng)用程序中,首先要?jiǎng)?chuàng)建一個(gè)應(yīng)用程序中,首先要?jiǎng)?chuàng)建一個(gè)qapplication對(duì)象對(duì)象 不管有多少個(gè)窗口,不管有多少個(gè)窗口,qapplication對(duì)象只能有一個(gè)對(duì)象只能有一個(gè),而且必須在其他對(duì)象之前創(chuàng)建,而且必須在其他對(duì)象之前創(chuàng)建 可以利用全局指針可以利用全局指針qapp訪問訪問qapplication對(duì)象對(duì)象 qapplication是是qobject的子類的子類13qapplication類類 qapplication類中封裝很多

9、函數(shù),其中包括:類中封裝很多函數(shù),其中包括: 系統(tǒng)設(shè)置:系統(tǒng)設(shè)置:setfont() 用來設(shè)置字體用來設(shè)置字體 事件處理:事件處理:sendevent() 用來發(fā)送事件用來發(fā)送事件 gui風(fēng)格:風(fēng)格:setstyles() 設(shè)置圖形用戶界面的風(fēng)格設(shè)置圖形用戶界面的風(fēng)格 顏色使用:顏色使用:colorspec() 用來返回顏色文件用來返回顏色文件 文本處理:文本處理:translate() 用來處理文本信息用來處理文本信息 創(chuàng)建組件:創(chuàng)建組件:setmainwidget() 用來設(shè)置窗口的主組件用來設(shè)置窗口的主組件 14函數(shù)分組函數(shù)分組 系統(tǒng)設(shè)置 事件處理 圖形用戶界面風(fēng)格 顏色使用 文本處理

10、窗口部件 高級(jí)光標(biāo)處理 x窗口系統(tǒng)同步 對(duì)話管理 線程 雜項(xiàng) desktopsettingsaware()、setdesktopsettingsaware()、cursorflashtime()、setcursorflashtime()、doubleclickinterval()、setdoubleclickinterval()、wheelscrolllines()、setwheelscrolllines()、palette()、setpalette()、font()、setfont()、fontmetrics()。 exec()、processevents()、enter_loop()、ex

11、it_loop()、exit()、quit()。 sendevent()、postevent()、sendpostedevents()、removepostedevents()、haspendingevents()、notify()、maceventfilter()、qwseventfilter()、x11eventfilter()、x11processevent()、wineventfilter()。 style()、setstyle()、polish()。 colorspec()、setcolorspec()、qwssetcustomcolors()。 setdefaultcodec()、

12、installtranslator()、removetranslator()、translate()。 mainwidget()、setmainwidget()、allwidgets()、toplevelwidgets()、desktop()、activepopupwidget()、activemodalwidget()、clipboard()、focuswidget()、winfocus()、activewindow()、widgetat()。 hasglobalmousetracking()、setglobalmousetracking()、overridecursor()、setover

13、ridecursor()、restoreoverridecursor()。 flushx()、syncx()。 issessionrestored()、sessionid()、commitdata()、savestate()。 lock()、unlock()、locked()、trylock()、wakeupguithread()。 closeallwindows()、startingup()、closingdown()、type()。 1516程序退出程序退出 退出事件程序,只需要在退出事件程序,只需要在程序結(jié)束時(shí)返回一個(gè)程序結(jié)束時(shí)返回一個(gè)exec(),例如:,例如:return app.e

14、xec(); 其中其中app為為qapplication的實(shí)例,當(dāng)調(diào)用的實(shí)例,當(dāng)調(diào)用exec()將將進(jìn)入主事件的循環(huán)中,直進(jìn)入主事件的循環(huán)中,直到到exit()被調(diào)用或主窗口部被調(diào)用或主窗口部件被銷毀件被銷毀#include #include int main(int argc, char *argv) qapplication app(argc, argv); qlabel *label = new qlabel(hello qt!); label-show(); return app.exec(); qapplication類負(fù)責(zé)程序退出類負(fù)責(zé)程序退出 退出應(yīng)用程序可以調(diào)用繼承自退出應(yīng)用程

15、序可以調(diào)用繼承自qcoreapplication類的類的quit或或exit函數(shù)函數(shù) qapplication是是qcoreapplication類的子類類的子類 quit ():告訴應(yīng)用程序退出,并返回:告訴應(yīng)用程序退出,并返回0(表示成功)(表示成功) exit(0):同:同quit() 舉例舉例qpushbutton *quitbutton = new qpushbutton(quit);connect(quitbutton, signal(clicked(), qapp, slot(quit();或或qapp-exit(0);17qapplication類負(fù)責(zé)關(guān)閉窗口類負(fù)責(zé)關(guān)閉窗口 調(diào)

16、用調(diào)用qapplication:closeallwindows () 尤其適用于有多個(gè)頂層窗口的應(yīng)用程序尤其適用于有多個(gè)頂層窗口的應(yīng)用程序 如果關(guān)閉窗口后,不想讓應(yīng)用程序退出,則需要調(diào)用函數(shù)如果關(guān)閉窗口后,不想讓應(yīng)用程序退出,則需要調(diào)用函數(shù) qapplication:setquitonlastwindowclosed (false) 舉例舉例exitact = new qaction(tr(e&xit), this);exitact-setshortcuts(qkeysequence:quit);exitact-setstatustip(tr(exit the application)

17、;connect(exitact, signal(triggered(), qapp, slot(closeallwindows();18qwidget類負(fù)責(zé)窗口部件類負(fù)責(zé)窗口部件 qwidget類是所有用戶界面對(duì)象的基類,是類是所有用戶界面對(duì)象的基類,是qobject類類的子類,繼承了的子類,繼承了qobject類的屬性。類的屬性。 窗口部件是用戶界面的一個(gè)原子:它從窗口系統(tǒng)接收鼠窗口部件是用戶界面的一個(gè)原子:它從窗口系統(tǒng)接收鼠標(biāo)、鍵盤和其它事件,并且在屏幕上繪制自己的表現(xiàn)。標(biāo)、鍵盤和其它事件,并且在屏幕上繪制自己的表現(xiàn)。 按鈕(按鈕(button)、菜單()、菜單(menu)、滾動(dòng)條()、

18、滾動(dòng)條(scroll bars)和框架()和框架(frame)都是窗口部件的例子。)都是窗口部件的例子。 通常,應(yīng)用程序都是一個(gè)控件,只是這個(gè)控件是由很多通常,應(yīng)用程序都是一個(gè)控件,只是這個(gè)控件是由很多其它的控件組成其它的控件組成19qwidget類(續(xù))類(續(xù)) 窗口部件可以包含其它的窗口部件。例如,一個(gè)應(yīng)用程窗口部件可以包含其它的窗口部件。例如,一個(gè)應(yīng)用程序界面通常就是一個(gè)包含了序界面通常就是一個(gè)包含了qmenubar,一些一些qtoolbar,一個(gè)一個(gè)qstatusbar和其它的一些部件的窗口。和其它的一些部件的窗口。 絕大多數(shù)應(yīng)用程序使用一個(gè)絕大多數(shù)應(yīng)用程序使用一個(gè)qmainwindo

19、w或者一個(gè)或者一個(gè)qdialog作為程序界面,但是作為程序界面,但是qt允許任何窗口部件成為允許任何窗口部件成為窗口。窗口。 當(dāng)窗口部件被創(chuàng)建的時(shí)候,它總是隱藏的,必須調(diào)用當(dāng)窗口部件被創(chuàng)建的時(shí)候,它總是隱藏的,必須調(diào)用show()來使它可見。來使它可見。 qwidget類有很多成員函數(shù),但一般不直接使用,而是類有很多成員函數(shù),但一般不直接使用,而是通過子類繼承來使用其函數(shù)功能。如,通過子類繼承來使用其函數(shù)功能。如,qpushbutton、qlistbox等都是它的子類等都是它的子類20上下文上下文 窗口函數(shù) 頂級(jí)窗口 窗口內(nèi)容 幾何形狀 模式 觀感 鍵盤焦點(diǎn)函數(shù) 鼠標(biāo)和鍵盤捕獲 事件處理器 變

20、化處理器 系統(tǒng)函數(shù) 這是什么的幫助 函數(shù)函數(shù) 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

21、()、width()、height()、sizepolicy()、setsizepolicy()、sizehint()、updategeometry()、layout()、move()、resize()、setgeometry()、framegeometry()、geometry()、childrenrect()、adjustsize()、mapfromglobal()、mapfromparent()、maptoglobal()、maptoparent()、maximumsize()、minimumsize()、sizeincrement()、setmaximumsize()、setminim

22、umsize()、setsizeincrement()、setbasesize()、setfixedsize()。 isvisible()、isvisibleto()、visiblerect()、isminimized()、isdesktop()、isenabled()、isenabledto()、ismodal()、ispopup()、istoplevel()、setenabled()、hasmousetracking()、setmousetracking()、isupdatesenabled()、setupdatesenabled()。 style()、setstyle()、cursor(

23、)、setcursor()、font()、setfont()、palette()、setpalette()、backgroundmode()、setbackgroundmode()、colorgroup()、fontmetrics()、fontinfo()。 isfocusenabled()、setfocuspolicy()、focuspolicy()、hasfocus()、setfocus()、clearfocus()、settaborder()、setfocusproxy()。 grabmouse()、releasemouse()、grabkeyboard()、releasekeyboar

24、d()、mousegrabber()、keyboardgrabber()。 event()、mousepressevent()、mousereleaseevent()、mousedoubleclickevent()、mousemoveevent()、keypressevent()、keyreleaseevent()、focusinevent()、focusoutevent()、wheelevent()、enterevent()、leaveevent()、paintevent()、moveevent()、resizeevent()、closeevent()、dragenterevent()、dr

25、agmoveevent()、dragleaveevent()、dropevent()、childevent()、showevent()、hideevent()、customevent()。 enabledchange()、fontchange()、palettechange()、stylechange()、windowactivationchange()。 parentwidget()、toplevelwidget()、reparent()、polish()、winid()、find()、metric()。 customwhatsthis()。 21qmainwindow類負(fù)責(zé)窗口創(chuàng)建類負(fù)責(zé)窗

26、口創(chuàng)建 在在qt程序中,創(chuàng)建窗口比較簡單,只要在程序中,創(chuàng)建窗口比較簡單,只要在main.cpp文件中為文件中為applicationwindow建立一個(gè)建立一個(gè)指針:指針: applicationwindow *mw = new applicatonwindow(); applicationwindow是在是在application.h中定義的中定義的類,它是一個(gè)類,它是一個(gè)qmainwindow的子類的子類 qmainwindow類是類是qwidget的子類,用于創(chuàng)建帶有菜的子類,用于創(chuàng)建帶有菜單欄和工具欄的窗口,如單欄和工具欄的窗口,如windows系統(tǒng)的瀏覽器系統(tǒng)的瀏覽器 另外,有另外

27、,有qdialog類也是類也是qwidget的子類,與的子類,與qmainwindow不同的是,不同的是,qdialog類用于創(chuàng)建對(duì)話框類用于創(chuàng)建對(duì)話框窗口,如多數(shù)軟件都有的窗口,如多數(shù)軟件都有的“關(guān)于關(guān)于”對(duì)話框。對(duì)話框。2223qt屬性與內(nèi)省元數(shù)據(jù)(元數(shù)據(jù)(meta data)qt用用c+實(shí)現(xiàn)內(nèi)?。▽?shí)現(xiàn)內(nèi)?。╥ntrospection)每一個(gè)每一個(gè) qobject 都有一個(gè)元對(duì)象都有一個(gè)元對(duì)象元對(duì)象涉及:元對(duì)象涉及:類名類名 (qobject:classname)繼承繼承 (qobject:inherits)屬性屬性信號(hào)和槽信號(hào)和槽普通信息普通信息(qobject:classinfo)24

28、元數(shù)據(jù)元數(shù)據(jù)元數(shù)據(jù)通過元對(duì)象編譯器元數(shù)據(jù)通過元對(duì)象編譯器(moc)在編譯時(shí)組在編譯時(shí)組合在一起。合在一起。sources*.cppexecutablesobject files*.oheaders*.h普通的普通的c+生成過程生成過程includescompileslinks25元數(shù)據(jù)元數(shù)據(jù)meta data元數(shù)據(jù)通過元對(duì)象編譯器元數(shù)據(jù)通過元對(duì)象編譯器(moc)在編譯時(shí)組在編譯時(shí)組合在一起。合在一起。moc從頭文件里面獲得數(shù)據(jù)。從頭文件里面獲得數(shù)據(jù)。sources*.cppexecutablesobject files*.oheaders*.hgeneratedmoc_*.cppqt c+ 生

29、成過程生成過程includescompileslinkscompilesmocs26元數(shù)據(jù)元數(shù)據(jù)moc 找什么?找什么?class myclass : public qobject 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;

30、qt 關(guān)鍵字類的一般信息 q_object宏, 通常是第一步首先確認(rèn)該類繼承自 qobject (可能是間接)27內(nèi)省內(nèi)省(introspection)類在運(yùn)行時(shí)了解它們自己的信息類在運(yùn)行時(shí)了解它們自己的信息對(duì)實(shí)現(xiàn)腳本和動(dòng)態(tài)語言的綁定有很好的支對(duì)實(shí)現(xiàn)腳本和動(dòng)態(tài)語言的綁定有很好的支持。持。if (object-inherits(qabstractitemview) qabstractitemview *view = static_cast(widget); view-.enum capitalsenum oslo, helsinki, stockholm, copenhagen ;int ind

31、ex = object-metaobject()-indexofenumerator(capitalsenum);object-metaobject()-enumerator(index)-key(object-capital();能夠?qū)崿F(xiàn)動(dòng)態(tài)轉(zhuǎn)換而不需要運(yùn)行時(shí)類型檢查( rtti)例子:它可以將枚舉值轉(zhuǎn)換成更容易閱讀和保存的字符串元對(duì)象了解細(xì)節(jié)28屬性屬性(properties)qobject有有g(shù)etter和和setter函數(shù)屬性函數(shù)屬性命名策略命名策略: color, setcolor對(duì)于布爾類型對(duì)于布爾類型: isenabled, setenabledclass qlabel : pu

32、blic qframe q_object q_property(qstring text read text write settext)public: qstring text() const;public slots: void settext(const qstring &);setter, 返回空,將值當(dāng)成唯一參數(shù)getter, 常量,返回值,沒有參數(shù)29屬性屬性為什么使用為什么使用setter 函數(shù)?函數(shù)?可以驗(yàn)證設(shè)置可以驗(yàn)證設(shè)置對(duì)可能的變化作出反應(yīng)對(duì)可能的變化作出反應(yīng)void setmin( int newmin ) if( newmin m_max ) qwarning(

33、ignoring setmin(%d) as min max., newmin); return; .void setmin( int newmin ) . m_min = newmin; updateminimum();30屬性屬性為什么使用為什么使用getter 函數(shù)?函數(shù)?間接的屬性間接的屬性qsize size() const return m_size;int width() const return m_size.width();31屬性屬性 q_property(type name read getfunction write setfunction reset resetfun

34、ction notify notifysignal designable bool scriptable bool stored bool user bool constant final)屬性跟類中數(shù)據(jù)成員的主要區(qū)別屬性跟類中數(shù)據(jù)成員的主要區(qū)別必須有一個(gè)必須有一個(gè)read函數(shù)函數(shù)有一個(gè)可選的有一個(gè)可選的write函數(shù)函數(shù)如果定義了如果定義了stored屬性表明這是一屬性表明這是一直存在的。直存在的。一個(gè)一個(gè)reset函數(shù)能夠把函數(shù)能夠把property設(shè)置設(shè)置成其默認(rèn)狀態(tài)成其默認(rèn)狀態(tài)一個(gè)一個(gè)designable屬性表明該屬性表明該property能在能在gui builder(一般為一般為q

35、t designer)可見可見注意:注意: q_property 主要用于主要用于qt designer plugin (插件)開發(fā)中(插件)開發(fā)中32使用屬性使用屬性直接獲取直接獲取通過元信息和屬性系統(tǒng)通過元信息和屬性系統(tǒng)在運(yùn)行時(shí)發(fā)現(xiàn)屬性在運(yùn)行時(shí)發(fā)現(xiàn)屬性qstring text = label-text();label-settext(hello world!);qstring text = object-property(text).tostring();object-setproperty(text, hello world);int qmetaobject:propertycount(

36、);qmetaproperty qmetaobject:property(i);qmetaproperty:name/isconstant/isdesignable/read/write/.33動(dòng)態(tài)屬性動(dòng)態(tài)屬性在運(yùn)行時(shí)給對(duì)象增加屬性在運(yùn)行時(shí)給對(duì)象增加屬性可以用來可以用來“標(biāo)識(shí)標(biāo)識(shí)”對(duì)象,等等。對(duì)象,等等。bool ret = object-setproperty(name, value);qobject:dynamicpropertynames() const真:如果屬性經(jīng)過真:如果屬性經(jīng)過q_property 定義 假:如果只是動(dòng)態(tài)增加假:如果只是動(dòng)態(tài)增加返回一個(gè)動(dòng)態(tài)屬性的列表34創(chuàng)建自定義

37、屬性創(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() const; void setangle(qreal);private: qreal m_angle;宏,描述屬性初始化值gettersetter私有狀態(tài)35創(chuàng)建自定義屬性創(chuàng)建自定義屬性angleobject:angleobject(qreal angle,

38、 qobject *parent) : qobject(parent), m_angle(angle)qreal angleobject:angle() const return m_angle;void angleobject:setangle(qreal angle) m_angle = angle; dosomething();初始化值getter 簡單返回值。這里你可以計(jì)算復(fù)雜的值。更新內(nèi)部狀態(tài), 對(duì)變化作出反應(yīng)。36自定義屬性自定義屬性 - 枚舉枚舉class angleobject : public qobject q_object q_enums(anglemode) q_pro

39、perty(anglemode anglemode read .)public: enum anglemode radians, degrees; .;普通枚舉聲明。宏通知qt anglemode 是一個(gè)枚舉類型。屬性使用枚舉作為類型。3738qt對(duì)象樹及內(nèi)存管理qobject類(續(xù))類(續(xù))-父子關(guān)系父子關(guān)系 每一個(gè)每一個(gè)qobject對(duì)象都可以有一個(gè)指向父親的參數(shù)對(duì)象都可以有一個(gè)指向父親的參數(shù) 孩子會(huì)通知他的父親自己的存在,父親會(huì)把它加入到自己孩子會(huì)通知他的父親自己的存在,父親會(huì)把它加入到自己的孩子列表中的孩子列表中 如果一個(gè)如果一個(gè)widget對(duì)象沒有父親,那么他就是一個(gè)窗口對(duì)象沒有父親

40、,那么他就是一個(gè)窗口 父部件可以父部件可以: 當(dāng)父部件隱藏或顯示自己的時(shí)候,會(huì)自動(dòng)的隱藏和顯示子部件當(dāng)父部件隱藏或顯示自己的時(shí)候,會(huì)自動(dòng)的隱藏和顯示子部件 當(dāng)父部件當(dāng)父部件enable和和disable時(shí),子部件的狀態(tài)也隨之變化時(shí),子部件的狀態(tài)也隨之變化 注意:在父部件可見的時(shí)候,子部件也可以單獨(dú)隱藏自己注意:在父部件可見的時(shí)候,子部件也可以單獨(dú)隱藏自己39改變所有者改變所有者qobject可以修改它所屬的父對(duì)象??梢孕薷乃鶎俚母笇?duì)象。父對(duì)象知道何時(shí)子對(duì)象被刪除父對(duì)象知道何時(shí)子對(duì)象被刪除一系列函數(shù)實(shí)現(xiàn)返回指針,從其所有者一系列函數(shù)實(shí)現(xiàn)返回指針,從其所有者“拿走拿走”釋放的數(shù)據(jù),釋放的數(shù)據(jù),把

41、它留給拿取者處理把它留給拿取者處理obj-setparent(newparent);delete listwidget-item(0); / 刪除第一個(gè)item(不安全)qlayoutitem *qlayout:takeat(int);qlistwidgetitem *qlistwidget:takeitem(int);/ safe alternativeqlistwidgetitem *item = listwidget-takeitem(0);if (item) delete item; item列表本質(zhì)上并不是子對(duì)象,而是擁有者。 這個(gè)例子進(jìn)行了說明。40qobject類(續(xù))類(續(xù))-

42、內(nèi)存管理內(nèi)存管理 所有子對(duì)象的內(nèi)存管理都轉(zhuǎn)移給了父對(duì)象所有子對(duì)象的內(nèi)存管理都轉(zhuǎn)移給了父對(duì)象 使用使用new在堆上分配內(nèi)存在堆上分配內(nèi)存 子對(duì)象可自動(dòng)被父對(duì)象刪除內(nèi)存子對(duì)象可自動(dòng)被父對(duì)象刪除內(nèi)存 手動(dòng)刪除不會(huì)引起二次刪除,因?yàn)樽訉?duì)象刪除時(shí)會(huì)通知父對(duì)象手動(dòng)刪除不會(huì)引起二次刪除,因?yàn)樽訉?duì)象刪除時(shí)會(huì)通知父對(duì)象 沒有父對(duì)象的沒有父對(duì)象的qobject對(duì)象都需要手動(dòng)刪除對(duì)象都需要手動(dòng)刪除 一般把這種無父親的對(duì)象分配在棧上,可以避免內(nèi)存泄露的問題一般把這種無父親的對(duì)象分配在棧上,可以避免內(nèi)存泄露的問題 qt是否有類似于自動(dòng)回收站的機(jī)制?但是事實(shí)是沒有的是否有類似于自動(dòng)回收站的機(jī)制?但是事實(shí)是沒有的! 只需要

43、關(guān)注對(duì)象的父子關(guān)系和功能只需要關(guān)注對(duì)象的父子關(guān)系和功能!41內(nèi)存管理內(nèi)存管理qobject 可以有父對(duì)象和子對(duì)象可以有父對(duì)象和子對(duì)象當(dāng)一個(gè)父對(duì)象被刪除,它的子對(duì)象也同樣被刪除。當(dāng)一個(gè)父對(duì)象被刪除,它的子對(duì)象也同樣被刪除。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);de

44、lete parent;parentchild1child2child1_1child1_2parent 刪除 child1 和 child2child1 刪除 child1_1 和 child1_242內(nèi)存管理內(nèi)存管理當(dāng)需要實(shí)現(xiàn)視覺層級(jí)時(shí)使用到它當(dāng)需要實(shí)現(xiàn)視覺層級(jí)時(shí)使用到它qdialog *parent = new qdialog();qgroupbox *box = new qgroupbox(parent);qpushbutton *button = new qpushbutton(parent);qradiobutton *option1 = new qradiobutton(box)

45、;qradiobutton *option2 = new qradiobutton(box);delete parent;parent 刪除 box 和 buttonbox 刪除 option1 和 option243使用模式使用模式使用使用 this指針指向最高層父對(duì)象指針指向最高層父對(duì)象在棧上分配父對(duì)象空間在棧上分配父對(duì)象空間void widget:showdialog() dialog dialog; if (dialog.exec() = qdialog:accepted) . dialog:dialog(qwidget *parent) : qdialog(parent) qgrou

46、pbox *box = qgroupbox(this); qpushbutton *button = qpushbutton(this); qradiobutton *option1 = qradiobutton(box); qradiobutton *option2 = qradiobutton(box); .dialog 在作用范圍結(jié)束時(shí)被刪除44構(gòu)造規(guī)范構(gòu)造規(guī)范幾乎所有的幾乎所有的 qobject 都有一個(gè)默認(rèn)為空值的父對(duì)象。都有一個(gè)默認(rèn)為空值的父對(duì)象。qwidget 的父對(duì)象是其它的父對(duì)象是其它 qwidget類類為了方便傾向于提供多種構(gòu)造(包括只帶有父對(duì)象的一為了方便傾向于提供多種構(gòu)

47、造(包括只帶有父對(duì)象的一種)種)父對(duì)象通常是帶缺省值的第一個(gè)參數(shù)。父對(duì)象通常是帶缺省值的第一個(gè)參數(shù)。 qlabel(const qstring &text, qwidget *parent=0, qt:windowflags f=0);qobject(qobject *parent=0);qpushbutton(qwidget *parent=0);qpushbutton(const qstring &text, qwidget *parent=0);qpushbutton(const qicon &icon, const qstring &text, qwid

48、get *parent=0);45構(gòu)造規(guī)范構(gòu)造規(guī)范當(dāng)創(chuàng)建自己的當(dāng)創(chuàng)建自己的 qobject時(shí)時(shí), 需考慮需考慮總是允許父對(duì)象總是允許父對(duì)象 parent 為為 0 (null)有一個(gè)只接受父對(duì)象的構(gòu)造函數(shù)有一個(gè)只接受父對(duì)象的構(gòu)造函數(shù)parent 是帶默認(rèn)值的第一個(gè)參數(shù)是帶默認(rèn)值的第一個(gè)參數(shù)提供幾種構(gòu)造函數(shù),避免空值、無效值提供幾種構(gòu)造函數(shù),避免空值、無效值(e.g. qstring()作為參數(shù)。作為參數(shù)。46qobject類對(duì)象類對(duì)象 qobject類是所有能夠處理類是所有能夠處理signal、slot和事件的和事件的qt對(duì)對(duì)象的基類,原形如下:象的基類,原形如下:qobject:qobjec

49、t ( qobject * parent =0,const char * name = 0 ) 創(chuàng)建帶有父對(duì)象及其名字的對(duì)象,對(duì)象的父對(duì)象可以看創(chuàng)建帶有父對(duì)象及其名字的對(duì)象,對(duì)象的父對(duì)象可以看作這個(gè)對(duì)象的所有者。比如,對(duì)話框是其中的作這個(gè)對(duì)象的所有者。比如,對(duì)話框是其中的ok和和cancel按鈕的父對(duì)象。按鈕的父對(duì)象。 在上面的函數(shù)中如果在上面的函數(shù)中如果parent為為0則構(gòu)造一個(gè)無父的對(duì)象則構(gòu)造一個(gè)無父的對(duì)象,如果對(duì)象是一個(gè)組件,則它就會(huì)成為頂層的窗口。,如果對(duì)象是一個(gè)組件,則它就會(huì)成為頂層的窗口。47qobject類(實(shí)例)類(實(shí)例)class mandelbrot:public qob

50、jectq_object /需要使用需要使用signal和和slotpublic :mandelbrot(const char *name, qobect *parent=0);public slots:void start();signals:void done();private slots:void calculate();private:qtimer timer;;48qobject類(實(shí)例)類(實(shí)例)/構(gòu)造初始化一個(gè)構(gòu)造初始化一個(gè)mandelbrot對(duì)象對(duì)象mandelbrot:mandelbrot(const char *name, qobject *parent):qobject

51、(parent, name)connect(&timer,signal(timeout(),slot(calculate();4950信號(hào)/槽機(jī)制回調(diào)函數(shù)回調(diào)函數(shù) 回調(diào)函數(shù)是一個(gè)通過函數(shù)指針調(diào)用的函數(shù)?;卣{(diào)函數(shù)是一個(gè)通過函數(shù)指針調(diào)用的函數(shù)。 如果把函數(shù)的指針如果把函數(shù)的指針(地址地址)作為參數(shù)傳遞給另一個(gè)作為參數(shù)傳遞給另一個(gè)函數(shù),當(dāng)這個(gè)指針被用為調(diào)用它所指向的函數(shù)函數(shù),當(dāng)這個(gè)指針被用為調(diào)用它所指向的函數(shù)時(shí),我們就說這是回調(diào)函數(shù)。時(shí),我們就說這是回調(diào)函數(shù)。 回調(diào)函數(shù)不是由該函數(shù)的實(shí)現(xiàn)方式直接調(diào)用,回調(diào)函數(shù)不是由該函數(shù)的實(shí)現(xiàn)方式直接調(diào)用,而是在特定的事件或條件發(fā)生時(shí)由另外的一方而是在特定的

52、事件或條件發(fā)生時(shí)由另外的一方調(diào)用的,用于對(duì)該事件或條件進(jìn)行響應(yīng)。調(diào)用的,用于對(duì)該事件或條件進(jìn)行響應(yīng)。51signal/slot機(jī)制機(jī)制 qt程序中,事件處理的方式也是回調(diào),但與回調(diào)函數(shù)所程序中,事件處理的方式也是回調(diào),但與回調(diào)函數(shù)所不同的是,事件的發(fā)出和接收采用了信號(hào)(不同的是,事件的發(fā)出和接收采用了信號(hào)(signal)和)和插槽(插槽(slot)機(jī)制,無須調(diào)用翻譯表,是類型安全的回)機(jī)制,無須調(diào)用翻譯表,是類型安全的回調(diào)。調(diào)。 類似于觀察者設(shè)計(jì)模式類似于觀察者設(shè)計(jì)模式 信號(hào)槽機(jī)制可以在對(duì)象之間彼此并不了解的情況下將它們的行信號(hào)槽機(jī)制可以在對(duì)象之間彼此并不了解的情況下將它們的行為聯(lián)系起來。為聯(lián)

53、系起來。 槽函數(shù)能和信號(hào)相連接,只要信號(hào)發(fā)出了,這個(gè)槽函數(shù)就會(huì)自槽函數(shù)能和信號(hào)相連接,只要信號(hào)發(fā)出了,這個(gè)槽函數(shù)就會(huì)自動(dòng)被調(diào)用。動(dòng)被調(diào)用。 利用信號(hào)和插槽進(jìn)行對(duì)象間的通信是利用信號(hào)和插槽進(jìn)行對(duì)象間的通信是qt的最主要特征之的最主要特征之一。一。52signal/slot機(jī)制(續(xù))機(jī)制(續(xù)) 當(dāng)對(duì)象狀態(tài)發(fā)生改變的時(shí)候,發(fā)出當(dāng)對(duì)象狀態(tài)發(fā)生改變的時(shí)候,發(fā)出signal通知所有的通知所有的slot接收接收signal,盡管它并不知道哪些函數(shù)定義了,盡管它并不知道哪些函數(shù)定義了slot,而,而slot也同樣不知道要接收怎樣的也同樣不知道要接收怎樣的signal signal和和slot機(jī)制真正實(shí)現(xiàn)了封裝

54、的概念,機(jī)制真正實(shí)現(xiàn)了封裝的概念,slot除了接除了接收收signal之外和其它的成員函數(shù)沒有什么不同之外和其它的成員函數(shù)沒有什么不同 signal和和slot之間是多對(duì)多的對(duì)應(yīng)關(guān)系。之間是多對(duì)多的對(duì)應(yīng)關(guān)系。 在在qobject中實(shí)現(xiàn)中實(shí)現(xiàn)53signal/slot實(shí)例實(shí)例 qt程序的窗口部件發(fā)射信號(hào)(程序的窗口部件發(fā)射信號(hào)(signals)來指出一個(gè)用)來指出一個(gè)用戶的動(dòng)作或者是狀態(tài)的變化。戶的動(dòng)作或者是狀態(tài)的變化。 當(dāng)信號(hào)被發(fā)射的時(shí)候,和信號(hào)相連的槽就會(huì)自動(dòng)執(zhí)行。當(dāng)信號(hào)被發(fā)射的時(shí)候,和信號(hào)相連的槽就會(huì)自動(dòng)執(zhí)行。 “信號(hào)和槽信號(hào)和槽”機(jī)制用于機(jī)制用于qt對(duì)象間的通訊。對(duì)象間的通訊。 #inc

55、lude #include int main (int argc, char *argv ) qapplication app (argc, argv); qpushbutton *button = new qpushbutton (“qui”,0); qobject:connect (button, signal (clicked (), &app, slot (quit (); button-show (); return app. exec ();54signal和和slot的聲明的聲明class student : public qobject q_objectpublic:

56、student() mymark = 0; int mark() const return mymark; public slots: void setmark(int newmark);signals: void markchanged(int newmark);private: int mymark;在在qt程序設(shè)計(jì)中,凡是包含程序設(shè)計(jì)中,凡是包含signal和和slot的類中都要加上的類中都要加上q_object宏定義宏定義信號(hào)是一個(gè)類的成員方法,該方法的實(shí)現(xiàn)是由信號(hào)是一個(gè)類的成員方法,該方法的實(shí)現(xiàn)是由meta-object自動(dòng)實(shí)現(xiàn)的自動(dòng)實(shí)現(xiàn)的對(duì)于開發(fā)者只需要在類中聲明這個(gè)信號(hào),并不需要

57、實(shí)現(xiàn)。對(duì)于開發(fā)者只需要在類中聲明這個(gè)信號(hào),并不需要實(shí)現(xiàn)。下面的例子給出了如何在一個(gè)類中定義下面的例子給出了如何在一個(gè)類中定義signal和和slot:55signal和和slot的聲明(續(xù))的聲明(續(xù))void student:setmark(int newmark) if (newmark!= mymark) mymark = newmark; emit markchanged(mymark); signal的發(fā)出一般在事件的處理函數(shù)中,利用的發(fā)出一般在事件的處理函數(shù)中,利用emit發(fā)出發(fā)出signal在下面的例子中在在事件處理結(jié)束后發(fā)出在下面的例子中在在事件處理結(jié)束后發(fā)出signal56s

58、ignal和和slot的聲明(續(xù))的聲明(續(xù)) 槽(槽(slot)和普通的)和普通的c+成員函數(shù)很像。成員函數(shù)很像。 槽是類的一個(gè)成員方法,當(dāng)信號(hào)觸發(fā)時(shí)該方法執(zhí)行。槽是類的一個(gè)成員方法,當(dāng)信號(hào)觸發(fā)時(shí)該方法執(zhí)行。 可以是虛函數(shù)(可以是虛函數(shù)(virtual)、可被重載()、可被重載(overload)、可以是公)、可以是公有的(有的(public)、保護(hù)的()、保護(hù)的(protective)或者私有的()或者私有的(private)。)。 可以象任何可以象任何c+成員函數(shù)一樣被直接調(diào)用,可以傳遞任何類型成員函數(shù)一樣被直接調(diào)用,可以傳遞任何類型的參數(shù),可以使用默認(rèn)參數(shù)。的參數(shù),可以使用默認(rèn)參數(shù)。

59、槽不同于信號(hào),需要開發(fā)者自己去實(shí)現(xiàn)。槽不同于信號(hào),需要開發(fā)者自己去實(shí)現(xiàn)。57什么是槽什么是槽?槽在各種槽段(槽在各種槽段(section)中定義。)中定義。槽可以返回值,但并不是通過聯(lián)接。槽可以返回值,但并不是通過聯(lián)接。任何數(shù)量的信號(hào)可以關(guān)聯(lián)到一個(gè)槽。任何數(shù)量的信號(hào)可以關(guān)聯(lián)到一個(gè)槽。它以一個(gè)普通的函數(shù)實(shí)現(xiàn)。它以一個(gè)普通的函數(shù)實(shí)現(xiàn)。它可以作為普通函數(shù)被調(diào)用。它可以作為普通函數(shù)被調(diào)用。public slots: void apublicslot();protected slots: void aprotectedslot();private slots: void aprivateslot();c

60、onnect(src, signal(sig(), dest, slot(slt();58什么是信號(hào)什么是信號(hào)?信號(hào)在信號(hào)段(信號(hào)在信號(hào)段(section)中定義)中定義信號(hào)總是返回空信號(hào)總是返回空信號(hào)總是不必實(shí)現(xiàn)信號(hào)總是不必實(shí)現(xiàn)由由moc來提供實(shí)現(xiàn)來提供實(shí)現(xiàn)信號(hào)可以關(guān)聯(lián)到任意數(shù)量的槽上信號(hào)可以關(guān)聯(lián)到任意數(shù)量的槽上通常產(chǎn)生一個(gè)直接調(diào)用通常產(chǎn)生一個(gè)直接調(diào)用,但是可以在線程之間作為事件來但是可以在線程之間作為事件來傳遞傳遞,甚至可以用在套接字之間甚至可以用在套接字之間(使用第三方類使用第三方類) 槽能以任意次序被激發(fā)槽能以任意次序被激發(fā)信號(hào)使用信號(hào)使用emit 關(guān)鍵字發(fā)射出去。關(guān)鍵字發(fā)射出去。signals: void asignal();emit asignal();59signa

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論