QML:通过信号与伟大的祖父母进行交流

时间:2013-08-23 16:13:48

标签: qt qml qtquick2

我目前正在学习Qt进行一些跨平台开发,我正在尝试使用QML做所有事情。我知道有很多方法可以使用C ++来解决我的问题,但我希望保持对模型的忠诚并使用QML。

这是:如果我使用加载器显示qml文件,如下面的代码所示,我如何与secondPage.qml中的main.qml进行通信?

我认为这是通过信号,但在进一步阅读时,似乎信号上的所有动作都在发送它的类中(使用连接方法)。以下是我的资源:http://qt-project.org/doc/qt-4.8/qmlevents.html#connecting-signals-to-methods-and-signals

或者,这可能是QML应用程序的错误设计。在事情变得无法控制之前,我试图摆脱使用单个源文件......

main.qml:

Rectangle {
    id: background
    ...
    Item{
        id: item1
        Loader {
          ....
            id:pageLoader;
            source : "secondPage.qml"
            focus:true;
         }
}

2 个答案:

答案 0 :(得分:2)

secondPage.qml中,您可以直接访问您的背景元素,因为子级可以访问层次结构中的任何父级。

另一种可能性是在secondPage组件中声明一个信号,然后将此组件中的信号连接到您的Loader的onLoaded处理程序中的曾祖父母中的信号。如果您希望在应用程序中多次重复使用组件而不考虑父级是什么,它会使它更容易和更清洁。

答案 1 :(得分:2)

你可以在SecondPage.qml中声明一些信号并将它们连接到Main.qml的函数。

如下所示,假设你在secondPage.qml中定义了secondPageSignal()并且你想在secondPage的信号上调用Main.qml中的doSomething()函数,你可以在Loader的onLoaded处理程序中连接它。

Rectangle {
    id: background
    ...

    function doSomething() {
    }
    Item{
        id: item1
        Loader {
          ....
            id: pageLoader;
            source : "secondPage.qml"
            focus:true;

            onLoaded:{
                 pageLoader.item.secondPageSignal.connect(background.doSomething);
            }
         }
    }
}