關(guān)于 QT 對象模型那些事
QT 對象模型 那些事是本文要介紹的內(nèi)容,標(biāo)準(zhǔn) C++對象模型提供了支持對象 paradigm 的高效運行環(huán)境.但是它的靜態(tài)本質(zhì)在某些問 題域中適應(yīng)性不夠. 圖形用戶界面編程既需要運行時效率又需要高度適應(yīng)性. Qt通過結(jié)合 C++的速度以及對象模型的適應(yīng)性達(dá)到了圖形用戶界面編程的目標(biāo).
Qt 為 C++ 添加了以下特性:
非常強大的,在對象之間進(jìn)行無縫通信的,稱作信號和槽的,機制.
可查詢和可設(shè)計的對象屬性.
強大的事件以及事件過濾.
用于國際化的取決于上下文的字符串翻譯.
成熟的內(nèi)部驅(qū)動時鐘使得QT能夠整合優(yōu)雅的在一個事件驅(qū)動GUI程序中整合多個目標(biāo).
以對象所有權(quán)這種非常自然方式組織的非常結(jié)構(gòu)化的及可查詢的對象樹.
安全指針(QPointer)可以在參考對象被銷毀后,自動置為0 ,而不像通常的 C++ 指針一樣這時會成為懸空指針.
在不同庫邊界之間動態(tài)轉(zhuǎn)換.
這些特征當(dāng)中的多數(shù)使用標(biāo)準(zhǔn) C++ 技術(shù)實現(xiàn), 基于對 QObject 的繼承. 此外,像對象通信機制以及動態(tài)屬性系統(tǒng), 需要Qt's 所有的元對象編譯器(moc)提供的元對象系統(tǒng) .
元對象系統(tǒng)是一個使得C++語言更加適合于組件編程擴張.盡管 templates也可以用來對C++進(jìn)行擴展, 元對象系統(tǒng)提供了標(biāo)準(zhǔn) C++ 使用 templates 所不能實現(xiàn)的好處; 查看:
Why Doesn't Qt Use Templates for Signals and Slots?
以獲取更多信息.
Qt對象: 身份標(biāo)識 還是 值
以上列出的QT對象模型添加的特征, 需要我們認(rèn)為 Qt 對象作為一個身份標(biāo)識,而非值.值可被復(fù)制或賦值;而身份標(biāo)識只能克隆. 克隆意指創(chuàng)建一個新的身份標(biāo)識,而不是完整復(fù)制舊的對象.例 如,雙胞胎有不同的身份標(biāo)識. 它們看起來可能完全一樣, 當(dāng)是有不同得名字, 不同的位置,以及 還可能會有完全不同的社會網(wǎng)絡(luò),也就是說克隆身份標(biāo)識是比復(fù)制或者賦值更加復(fù)雜的操作.我們可以在QT對象模型中發(fā)現(xiàn)這一點.
對于一個 QT 對象:
有***的 QObject::objectName()名字.如果我們復(fù)制一個Qt對象,如何命名復(fù)制對象?
在對象體系中有一個位置. 如果我們復(fù)制一個Qt對象, 該把復(fù)制對象放體系中哪個位置?
能夠被連接到其他 Qt 對象,以發(fā)送信號到其他 Qt 對象或接收其他Qt 對象發(fā)送的信號. 如果我們復(fù)制一個 Qt 對象, 我們?nèi)绾翁幚韽?fù)制對象的信號-槽連接?
可以在運行時添加在 C++ 中所沒有聲明的新屬性. 如果我們可以復(fù)制一個Qt對象, 那麼我們是否需要繼承這些動態(tài)添加的新屬性?
由于以上原因, Qt對象應(yīng)該被當(dāng)做身份標(biāo)識, 而不是作為值. 身份標(biāo)識是被克隆, 而不是被復(fù)制 ,克隆身份標(biāo)識是比復(fù)制或者賦值更加復(fù)雜的操作. 因此, QObject及其所有子類(直接或 間接)禁用了它們的復(fù)制構(gòu)造函數(shù)和復(fù)制操作符號。
小結(jié):QT 對象模型 那些事的內(nèi)容介紹完了,希望本文對你有所幫助。更多相關(guān)內(nèi)容請參考編輯推薦。