QML: изменение свойства дочернего объекта, определенного в другом файле QML (не main.qml) - PullRequest
0 голосов
/ 30 октября 2018

В принципе, у меня есть что-то вроде:

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;
}

И я получаю следующую ошибку: Ошибка типа: невозможно прочитать свойство 'dataArea' из неопределенного

Итак, я хотел спросить: как мне подключить этот сигнал к дочернему объекту, который определен в DataDisplay.qml? Я могу получить информацию в main.qml с помощью сигналов, но, похоже, не могу разыменовать дочерние объекты

Edit:

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);

- это то, как я устанавливаю контекст (из 3 классов, как вы можете видеть). Я могу получать сигналы от любого из трех в main.qml, а также вызывать слоты в любом из трех в main.qml; Я еще не пытался вызывать слоты из классов c ++ в других файлах qml, но я предполагаю, что это будет работать, потому что я могу получить доступ к свойствам родителя из дочернего элемента

Ответы [ 2 ]

0 голосов
/ 30 октября 2018

1 - у вас есть 3 указателя, указывающих на один и тот же объект. Одного достаточно. Действительно!

2 - до тех пор, пока ark реализован правильно, вы можете получить доступ к ark.comm и ark.modb из QML, нет необходимости выставлять их по отдельности.

3 - вы, кажется, не понимаете сферу действия id с. Взгляните на этот исчерпывающий ответ . dataShow просто не виден с того места, где вы установили соединение.

4 - свойства контекста не очень эффективны, это скорее «быстрый и грязный» подход для представления C ++ в qml. Для оптимальной производительности рассмотрим более эффективный подход .

В общем, вы проявляете типичные симптомы «забегать вперед». Потратьте время на изучение, прежде чем практиковать.

0 голосов
/ 30 октября 2018

Как вы действительно предполагаете, вы можете использовать переменную modb и в других qml, поскольку она добавляется в rootContext. Я бы посоветовал этот вариант.

Другой вариант, который вы можете попробовать, это просто использовать dataArea.text = string, поскольку идентификаторы идут повсюду (в конце концов, это javascript), в этом случае вы должны использовать сильные идентификаторы.

Другой вариант - определить property alias для передачи строки по объектам ( См. Документацию Qt ). Или используйте property string, но это еще больше работы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...