【问题标题】:QML: Communicating with great grandparents through signalsQML:通过信号与曾祖父母交流
【发布时间】:2013-08-24 09:22:37
【问题描述】:

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

这里是:如果我使用加载器来显示 qml 文件,如以下代码所示,我如何从 secondPage.qml 与 main.qml 通信?

我认为这将是通过信号,但进一步阅读后,似乎对信号的所有操作都在发送它的类中(使用连接的方法)。这是我的资源:@​​987654321@

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

main.qml:

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

【问题讨论】:

  • 叹息...我改写了文本以澄清问题,但没有修复标题。对于“曾祖父母”的误用,我深表歉意
  • @berules > 在secondPage.qml 你可以直接访问你的背景元素。另一种可能性是在您的secondPage 组件中声明一个信号,然后在您的LoaderonLoaded 处理程序中将来自该组件的信号连接到您曾祖父母的信号
  • 是的!你是对的!我以某种方式说服自己 secondPage.qml 在其他一些错误之后无法访问其父级,但事实并非如此。非常感谢,如果您将此作为答案提交,我将确保接受。

标签: qt qml qtquick2


【解决方案1】:

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

如下所示,假设您在 secondPage.qml 中定义了 secondPageSignal(),并且您想在 Main.qml 中对 secondPage 的信号调用 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);
            }
         }
    }
}

【讨论】:

    【解决方案2】:

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

    另一种可能性是在你的secondPage 组件中声明一个信号,然后在你的加载器的onLoaded 处理程序中将来自这个组件的信号连接到你曾祖父母的信号。如果您希望您的组件在您的应用程序中可多次重复使用,而无需确定父组件是什么,它会变得更容易和更简洁。

    【讨论】:

    • 对不起,我后来意识到我们俩在谈论同样的事情并发布了相同的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多