Попытка заставить это работать в Qt версии 5.9
Кажется, что всякий раз, когда я создаю объект в Вкладка QML, он не распознается родительским объектом (или любым из родителей родителя и т. д.). Как заставить родительские объекты распознавать объект на вкладке? Или, если это невозможно, то как обходным путем вызвать функцию объекта на вкладке?
Я сократил код до этого упрощенного примера:
import QtQuick 2.9
import QtQuick.Window 2.2
import QtQuick.Controls 1.4
Window {
Rectangle {
id: myFunctionCaller
Component.onCompleted: {
myParent.myFunction();
myChild.myFunction();
myGrandChild.myFunction();
}
}
TabView {
id: myParent
property Rectangle grandchild: myGrandChild
onGrandchildChanged: console.info("Parent recognizes GrandChild");
function myFunction() {
console.info("I'm the Parent");
}
Tab{
id: myChild
property Rectangle grandchild: myGrandChild
onGrandchildChanged: console.info("Child recognizes GrandChild");
function myFunction() {
console.info("I'm the Child");
}
Rectangle {
id: myGrandChild
function myFunction() {
console.info("I'm the GrandChild");
}
}
}
}
}
Я ожидаю этот вывод:
I'm the Parent
I'm the Child
I'm the GrandChild
Parent recognizes Grandchild
Child recognizes Grandchild
Тем не менее, я получаю этот вывод:
I'm the Parent
I'm the Child
ReferenceError: myGrandChild is not defined.
ReferenceError: myGrandChild is not defined.
ReferenceError: myGrandChild is not defined.
Ошибка возникает в этих строках:
myGrandChild.myFunction();
onGrandchildChanged: console.info("Parent recognizes GrandChild");
onGrandchildChanged: console.info("Child recognizes GrandChild");
Tab
является подклассом Loader
, поэтому Rectangle
не создается, пока Tab
не станет активным.
Tabs are lazily loaded; only tabs that have been made current (for example, by clicking on them) will have valid content. You can force loading of tabs by setting the active property to true
Таким образом, id: myGrandChild
доступен только в (исходном) компоненте, автоматически созданном в загрузчике.
Решение состоит в том, чтобы активировать вкладку и обратиться к ребенку с помощью myChild.item
.
(Не испытано)
Если вы действительно вызываете myChild.item.myFunction()
, вы не ссылаетесь на myGrandChild. Эта ошибка должна возникнуть в одной из ваших строк, где вы пытаетесь сослаться на Rectangle
через id: myGrandChild
, что выходит за рамки всех объектов, кроме самого Rectangle
.
myGrandChild.myFunction();
-> myChild.item.myFunction()
, в TabView
: property Rectangle grandchild: myGrandChild
-> property Rectangle grandchild: myChild.item
, в Tab
: property Rectangle grandchild: myGrandChild
-> property Rectangle grandchild: item
Вы абсолютно правы, на моем конце была опечатка. Спасибо!
Позвольте мне задать вам еще один вопрос: если я визуально смотрю на Tab1, и что-то, на что я нажимаю, должно вызвать функцию, размещенную на Tab2, даже если Tab1 является активной вкладкой (а Tab2 нет), возможно ли вызвать Функция Tab2? Или это плохая общепринятая практика?
Я бы сказал, было бы лучше отделить данные, с которыми вы можете действовать (модель), от вкладки (представления) и вызвать функцию модели, которая изменит отображаемые данные на вкладке 2, как только она станет активной. Таким образом, вы можете сделать вкладки неактивными без потери данных.
Итак, могу ли я предположить, что вкладка myGrandChild активна по умолчанию, поскольку это единственная вкладка в MyChild TabView? Если это так, то я должен правильно вызвать mChild.item.myFunction()? Я пробовал это, и это не имело значения, я все еще получаю «myGrandChild не определен»