簡體   English   中英

使用C ++訪問Qt / QML對象

[英]Accessing Qt / QML objects with C++

我正在研究一個C ++ Qt項目,該項目最終將與串行端口通信。 其中一部分是在C ++部分中訪問QML對象。 我有可以設置QML屬性的代碼,但是現在訪問那些作為方法的功能很麻煩。 查看以下代碼:

object = view.rootObject();

rect = object->findChild<QObject *>("box");
rect->setProperty("color", "red");                  // Verifies the object tree is accessible
viewer = object->findChild<QObject *>("viewer");    // Access the viewer text box

viewer->append("dummy text");           // OOPS! This doesn't compile!!!

現在,將類型設置為方法setProperty(..),但如何訪問對象的方法。 “查看器”是一個TextArea,我想先執行一次selectAll(),然后執行cut()清除框。

這里的問題是如何編碼? 謝謝大家

當然,它不會編譯, QObject沒有append()方法。

如果它是C ++函數,則必須將qobject_cast轉換為具有它的適當類型。 但是,對於在C ++中實現的許多現有QML類型,這並不總是很容易獲得,並且作為C ++類型,它們不是公共API的一部分,通常也不打算供最終用戶直接使用。

如果它是JS函數,則必須使用QMetaObject::invokeMethod 這也適用於已生成元數據的C ++函數。 setProperty()也是如此,而setColor()不能與QObject*一起工作,就像append()不能那樣。

最后但並非最不重要的一點是,絕對沒有充分的理由讓您使用C ++進行此類操作。 從C ++使用QML對象的設計較差,而且是反模式的。 您只會養成這樣做的壞習慣。 這種相互作用必須限於使用信號,時隙和屬性的明確定義的接口。 一般來說,QML可以進入C ++,因為這只能通過公開的接口進行,但是即使可能,也不應采用相反的方式。

這樣想吧-汽車使用發動機,發動機不使用汽車。 發動機控制通過啟動鍵和油門踏板連接,不直接使用。 C ++內容應保留給應用程序引擎-高性能或高效核心邏輯或后端,而QML部分用於GUI /前端。

在這里使用invoke方法使用發布的答案,這是有效的解決方案:

// C++ Code to call function reset()
QMetaObject::invokeMethod(object, "reset");

// QML code to select all text the delete it
function reset() {
    viewer.selectAll()
    viewer.cut()
}

作者的QML部分可能會公開別名屬性,以對所需的文本字段內容進行操作:

import QtQuick 2.0
import QtQuick.Controls 1.2

Item {
    property alias viewerText: viewer.text // added

    width: 350
    height: 450
    TextArea {
        id: viewer
        x: 8
        y: 8
        width: 223
        height: 415
        text: "text"
        font.pixelSize: 12
        objectName: "viewer"
    }
    Button {
        id: open
        x: 251
        y: 8
        text: "Open"
    }
}

然后作者的C ++部分可以輕松做到:

auto* object = view.rootObject();    
viewer = object->findChild<QObject *>("viewer");
viewer->setProperty("viewerText", "dummy text"); // using the new property added

暫無
暫無

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

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