Qt 從C 定義QML型別(一)

2021-08-20 10:01:38 字數 1441 閱讀 6293

前面幾篇文章介紹了如何在 qml 中呼叫 c++ 屬性,那麼這裡集中總結一下如何在 c++中定義 qml 型別,其實在之前的示例中已經有用到過的。

當用c ++**擴充套件qml時,可以向qml型別系統註冊乙個c ++類,以便該類可以在qml**中用作資料型別。雖然任何qobject派生類的屬性,方法和訊號都可以從qml訪問,但這樣的類不能用作qml中的資料型別,直到它被註冊到型別系統。此外,註冊可以提供其他功能,例如允許將類用作來自qml 的可例項化的qml物件型別,或者允許從qml匯入和使用該類的單例例項。

另外,qt qml模組提供了一些機制來實現特定於qml的功能,例如c ++中的附加屬性和預設屬性。

可以向qml型別系統註冊乙個qobject派生類,以使該型別可以在qml**中用作資料型別。

該引擎允許註冊可例項化型別和不可例項化型別。註冊乙個可例項化型別使得c ++類可以用作qml物件型別的定義,允許它用於來自qml**的物件宣告中以建立這種型別的物件。註冊還為引擎提供了額外的型別元資料,使型別(以及由類宣告的任何列舉)能夠用作屬性值,方法引數和返回值的資料型別,以及在qml和c ++之間交換的訊號引數。

註冊不可例項化的型別也以這種方式將類註冊為資料型別,但該型別不能用作qml中的qml物件型別例項化。例如,如果某個型別具有應該暴露給qml的列舉,但該型別本身不應該是可例項化的。

任何qobject派生的c ++類都可以註冊為qml物件型別的定義。一旦乙個類註冊到qml型別系統中,該類就可以像qml**中的任何其他物件型別一樣被宣告和例項化。一旦建立,可以從qml操作類例項; 作為將c ++型別的屬性公開給qml使用,可以從qml**訪問任何qobject派生類的屬性,方法和訊號。

要將qobject引發的類註冊為可例項化的qml物件型別,請呼叫qmlregistertype()將該類註冊為qml型別到特定的型別命名空間中。然後,客戶端可以匯入該命名空間以使用該型別。

class student : public qobject

...}

在 main 函式中使用qmlregistertype註冊:

qmlregistertype("student", 1, 0, "student");
上面這句的意思就是,將 student 類註冊到」student」命名空間中,並且該空間的版本是1.0,其實在 qt 幫助中通常是將命名空間定義格式為如下格式:

qmlregistertype("com.mytest.student", 1, 0, "student");
這樣定義其實會更直觀的知道命名空間的名稱,然後第四個引數」student」就是在 qml 中引用該類的名稱。

在qml 的物件宣告中,可以讀取和寫入它的屬性,呼叫格式如下:

import com

.mytest

.student

1.0student

Qt註冊自定義型別

如果要在qt訊號槽中使用自定義型別,需要注意使用qregistermetatype對自定義型別進行註冊,當然在不跨執行緒時使用自定義型別signal slot來傳遞,可能不會出現什麼問題 一旦涉及跨執行緒就很容易出錯,回想下訊號槽的作用就是用來物件與物件之間通訊的,難免會跨執行緒,建議在使用自定義型...

Qt 3D 高階自定義材質QML示例

qt自帶整合開發環境 ide 名為qt creator。它可以在linux os x和windows上執行,並提供智慧型 完成 語法高亮 整合幫助系統 偵錯程式和剖析器整合,還整合了所有主要的版本控制系統 如git bazaar 除了qt creator外,windows上的開發人員還可以使用qt的...

Qt 在QML中自定義貝塞爾動畫曲線

qt在propertyanimation中,已經準備了很多常用的動畫曲線,比如說linear quad elastic等。這些基本已經可以覆蓋我們大部分需求了,但是也不是所有的。比如說,google非常有名的設計風格material,就有自己的動畫曲線,如下圖 這個呢,在qml中是沒有的。要實現它,...