Russian Qt Forum

Qt => Qt Quick => Тема начата: warlock от Май 22, 2011, 23:07



Название: Глобальный доступ в QML
Отправлено: warlock от Май 22, 2011, 23:07
Заголовок мало о чем говорит, но не придумал ничего точнее.
Есть 2 QML файла:
1) main.qml
2) other.qml

main.qml
Код:
Rectangle {
...
Other {
    id: other
}
Rectangle {
...
    MouseArea {
        anchors.fill: parent
        onClick: {/* Тут вызвать метод определенный в MyType */}
    }
...
}
...
}

other.qml
Код:
Rectangle {
...
MyType {
    id: myType
}
...
}

Т.е. как обеспечивается доступ к объектам находящимся в одном файле, из другого файла?


Название: Re: Глобальный доступ в QML
Отправлено: twp от Май 23, 2011, 11:48
в таких случаях можно добавить функцию в other например так:

Код:
Rectangle {
    function doSomething() {
        myType.doSomething();
    }
...
MyType {
    id: myType
}
...
}
Ну а потом естетственно вызвать ее в main.qml


Название: Re: Глобальный доступ в QML
Отправлено: warlock от Май 23, 2011, 20:45
Хм, интересно. А как сделать обратную операцию? Из other вызвать метод находящийся в main?


Название: Re: Глобальный доступ в QML
Отправлено: twp от Май 24, 2011, 09:18
подобных вещей следует избегать, перекрестные ссылки не есть гуд. Нужно стараться уменьшить число зависимостей между модулями. Кроме того может произойти рекурсивная инициализация. Конечно можно создать свойство-ссылку в other.qml и инициализировать его в main.qml например так:

other.qml
Код:
Rectangle {
   property Item mainWindow
MyType {
    id: myType
}
...
}

main.qml:
Код:
Rectangle {
    id: main
Other {
    id: other
    mainWindow: main
}
Rectangle {
...
}
...
}
теперь в other можно можно вызывать функции из main используя ссылку mainWindow

Но лучше испускать сигнал из other, а в main его ловить и обрабатывать. Если же все таки надо чтоб были две ссылки на other и main, то лучше вынести это в отдельный модуль-посредник, который бы оперировал этими объектами.