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