淺析 Qt 對(duì)象模型
本文主要介紹的是來(lái)淺談Qt 對(duì)象模型,它有很大的特性,現(xiàn)在讓我們先來(lái)認(rèn)識(shí)一下吧。請(qǐng)看內(nèi)容。
Qt對(duì)象模型
標(biāo)準(zhǔn)的 C++ 對(duì)象模型提供了非常有效的操作時(shí)間來(lái)支持對(duì)象范例。但它的靜態(tài)性質(zhì)在某些問(wèn)題領(lǐng)域是不夠靈活的。圖形用戶界面編程就是一個(gè)同時(shí)需要操作時(shí)間效率和高度靈活性的領(lǐng)域。 Qt通過(guò)結(jié)合C++的速度和Qt對(duì)象模型的靈活性來(lái)提供。
Qt添加了以下特性到C++中:
一種稱為信號(hào)和槽用于無(wú)縫對(duì)象通信的強(qiáng)大機(jī)制。
可查詢和可設(shè)計(jì)的 對(duì)象屬性
強(qiáng)大的事件和事件過(guò)濾器
根據(jù)上下文的國(guó)際化字符串翻譯
完善的時(shí)間間隔驅(qū)動(dòng)的計(jì)時(shí)器使得在一個(gè)事件驅(qū)動(dòng)的圖形界面中優(yōu)美的整合多個(gè)任務(wù)成為可能。
以一種很自然的方式組織對(duì)象所有權(quán)的分層的和可查詢的對(duì)象樹(shù)
被防護(hù)的指針 (QPointer)在參考對(duì)象被銷毀的時(shí)候被自動(dòng)地設(shè)置為0, 不像正常的C++指針那樣在它們的對(duì)象被銷毀的時(shí)候就變成了野指針。
一種穿越庫(kù)邊界的動(dòng)態(tài)計(jì)算
許多這些Qt的特性是通過(guò)標(biāo)準(zhǔn)的C++技術(shù)實(shí)現(xiàn)的,基于 QObject的繼承。其他的,像對(duì)象通信機(jī)制和動(dòng)態(tài)性質(zhì)系統(tǒng),需要由Qt自己的元對(duì)象編譯器(moc) 提供的元對(duì)象系統(tǒng)。
元對(duì)象系統(tǒng)是一個(gè)C++擴(kuò)展,它使得這個(gè)語(yǔ)言更適合真正的組件GUI編程。雖然模板也可以用來(lái)擴(kuò)展C++, 但是元對(duì)象系統(tǒng)提供了用標(biāo)準(zhǔn)C++而模板所不能達(dá)到的好處;請(qǐng)看為何Qt不使用模板來(lái)實(shí)現(xiàn)信號(hào)和槽?
Qt對(duì)象: 身份 vs 值
許多上面所列的Qt對(duì)象模型所增加的特性,需要我們把對(duì)象看作身份,而不是值。值可以被拷貝和給定;身份可以被克隆??寺∫馕吨鴦?chuàng)建一個(gè)新的身份,而不是一個(gè)舊身份的拷貝。例如,雙胞胎擁有不同的身份。他們可能看起來(lái)長(zhǎng)的一樣,但是他們有不同的名字,不同的位置,還可能有完全不同的社交圈。
克隆一個(gè)身份是一個(gè)比對(duì)一個(gè)值進(jìn)行拷貝或者指定要復(fù)雜的多的操作。我們可以在Qt對(duì)象模型中看到這到底意味著什么。
一個(gè)Qt對(duì)象...
可能有一個(gè)***的QObject::objectName().如果我們拷貝一個(gè)Qt對(duì)象,那我們應(yīng)該給這個(gè)拷貝一個(gè)什么名字呢?
有一個(gè)位置在一個(gè)對(duì)象層次中。如果我們拷貝一個(gè)Qt對(duì),這個(gè)拷貝又該放在何處呢?
可以與其他Qt對(duì)象相連接來(lái)發(fā)射對(duì)象給它們或者接收它們所發(fā)射的信號(hào)。如果我們拷貝一個(gè)Qt對(duì)象,我們?cè)撊绾伟堰@些連接傳遞給這個(gè)拷貝呢?
可以把沒(méi)有在C++類中聲明的新性質(zhì)在運(yùn)行的時(shí)候添加給它。如果我們拷貝一個(gè)Qt對(duì)象, 這個(gè)拷貝是不是應(yīng)該包含我們添加給原對(duì)象的新性質(zhì)呢?
由于這些原因,Qt對(duì)象應(yīng)該被當(dāng)作身份,而不是值。身份可以被克隆,但是不能被拷貝或者指定大小,而且克隆一個(gè)身份是一個(gè)比拷貝或者指定一個(gè)值要復(fù)雜的多的操作。因此,QObject和所有QObject的子類(直接或間接的)使得它們的 拷貝構(gòu)造函數(shù)和分配操作 無(wú)效.。















 
 
 
 
 
 
 