簡體   English   中英

Qt QML-CPP 將 class 公開為 Q_PROPERTY

[英]Qt QML-CPP expose class as Q_PROPERTY

是否可以將 class 公開為 Q_PROPERTY? (我知道如何公開本機變量。)

就我而言,我想處理同時發生變化的數據塊,並且我想在同一幀渲染它。

可能嗎?

一般來說,是的,你可以。 只要您的自定義 class 使用 Q_OBJECT 或 Q_GADGET 宏,您就可以在此自定義類型上使用 Q_PROPERTY。

為了更好地理解,請查看此文檔: https://wiki.qt.io/How_to_Use_a_Custom_Class_in_C%2B%2B_Model_and_QML_View

假設您正在實現 QDir 和 QFileInfo 的包裝器,並且您已經將 Dir 和 FileInfo 都實現為 QObjects。 然后在一個方法中返回 FileInfo,您的代碼將如下所示:

FileInfo* Dir::fileInfo(const QString& fileName) const {
    FileInfo* fileInfo = new FileInfo(fileName);
    QQmlEngine::setObjectOwnership(fileInfo, QQmlEngine::JavaScriptOwnership);
    return fileInfo;
}

上面的代碼片段所做的是創建一個新的 FileInfo QObject,但是如果這個 QObject 的引用計數下降到 0,那么我們允許 QML/JS 引擎特權在需要時對其進行垃圾收集。 代碼片段沒有顯示您需要正確注冊 FileInfo 和 Dir 類的 qmlRegisterType(或它們的 QML_ELEMENT 等效項),但是,我假設您已經知道如何執行此操作。 因為它是一個 QObject,所以應用程序可以獲取這個 object 的副本,並且可以在運行時檢查(即反射)它的所有屬性和方法。 智能感知是可能的。

上述模式也類似於屬性。 我可能會做類似的事情:

FileInfo* Dir::defaultFileInfo() {
    if (!m_FileInfo) {
        m_FileInfo = new FileInfo(this);
        QQmlEngine::setObjectOwnership(m_FileInfo, QQmlEngine::CppOwnership);
    }
    return m_FileInfo;
}

上面的代碼片段表明父 class 將控制請求 object 的創建和銷毀,並且最多會創建一個實例,隨后對該屬性的訪問將返回相同的實例。

至於 Q_GADGET。 從技術上講,我只會返回一個 Q_GADGET,您知道 object 的整個生命周期,例如,在您希望方便地提供對 class 和方法的訪問的信號中。 這樣做的好處是沒有對 object 的 QML/JS 引擎的委托,也沒有任何類型寄存器或 memory 管理。 這對於暴露結構很有用,但需要注意的是,對這個 class 的訪問僅限於信號處理程序的持續時間,並且不允許超出此范圍的訪問。 應用程序可以從 class 中復制出它需要的任何值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM