簡體   English   中英

QML:修改在另一個QML文件(不是main.qml)中定義的Child對象的屬性

[英]QML: modifying a property of a Child object that is defined in a different QML file (not main.qml)

基本上,我有這樣的東西:

Main.qml:

ApplicationWindow{
width: 500
height: 500

    Page{
    id: page0

        DataPage{
          id: datapage0  
        }
    }
}

DataPage.qml:

Page{
id: displayPage

    DataDisplay{
    id: dataShow
    }
}

DataDisplay.qml:

Label{
text: "data: "
}

TextArea{
id: dataArea
text: ""
}

我已經刪除了我認為不相關的內容(例如錨點,高度,寬度等)。 現在,在main.qml中,我有一個來自c ++后端的信號:

Connections{
target: modb
onPostData: {
    page0.datapage0.dataShow.dataArea.text = string;
}

我收到以下錯誤:TypeError:無法讀取未定義的屬性'dataArea'

因此,我想問:如何將信號連接到DataDisplay.qml中定義的子對象? 我可以使用信號將信息獲取到main.qml中,但是似乎無法取消引用子對象

編輯:

main.cpp:

QQmlContext* ctx0 = engine.rootContext();
ctx0->setContextProperty("ark", &ark);

QQmlContext* ctx1 = engine.rootContext();
ctx1->setContextProperty("comm", ark.comm);

QQmlContext* ctx2 = engine.rootContext();
ctx2->setContextProperty("modb", ark.modb);

這就是我設置Context的方式(如您所見,共有3個類)。 我可以從這三個中的任何一個獲取信號到main.qml中,也可以在這三個中的任何一個中獲取呼叫槽; 我尚未嘗試從其他qml文件中的c ++類調用插槽,但是我認為它會起作用,因為我可以從子級訪問父級的屬性

1-您有3個指針指向同一對象。 一個就足夠了。 真!

2-只要正確實現了ark ,就可以從QML訪問ark.commark.modb ,而無需單獨暴露它們。

3-您似乎不太了解id的范圍。 看一下這個詳盡的答案 無論您在哪里建立連接, dataShow都根本不可見。

4-上下文屬性不是很有效,更多的是將C ++暴露給qml的“快速而骯臟的”方法。 為了獲得最佳性能,請考慮使用更有效的方法

總而言之,您表現出“超越自己”的典型症狀。 在練習之前,花點時間學習。

正如您確實假定的那樣,您也可以在其他modb中使用modb變量,因為它已添加到rootContext 我建議這個選擇。

您可以嘗試的另一種選擇是只使用dataArea.text = string因為id遍地都是(畢竟是javascript),在這種情況下,您應該使用強id。

另一個選擇是定義property alias ,以將字符串傳遞給對象( 請參閱Qt docs )。 或使用property string ,但這還需要更多工作。

暫無
暫無

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

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