Qt - 如果加载程序源动态更改,如何连接来自加载程序项的信号

Abi*_*bin 5 qt qml

我有一个应用程序需要在多个可用屏幕之间切换屏幕。我正在检查 qml 中的加载器是否可以实现这一点。

我面临的问题是连接已加载项目的信号。

我在 qt 文档中使用了一个应用程序示例,发现应用程序 qml 中的 CreateConnection 不能有 if 条件。

我还尝试使其在函数中发出信号槽连接并在加载程序的源更改时调用,但这也不起作用。

应用程序.qml

import QtQuick 2.0

Item {
    width: 100; height: 100

    Loader {
       id: myLoader
       source: "MyItem.qml"
    }

    Connections {
        target: myLoader.item
        // here i tried using if (myLoader.item == "qrc:MyItemOne.qml") , but can't use if
        onChangeToSecond: {
               myLoader.source = "MyItemTwo.qml"
        }

        onChangeToFirst: {
               myLoader.source = "MyItemOne.qml"
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

MyItemOne.qml

import QtQuick 2.0

Rectangle {
   id: myItem
   signal changeToSecond()

   width: 100; height: 100

   MouseArea {
       anchors.fill: parent
       onClicked: myItem.changeToSecond()
   }
}
Run Code Online (Sandbox Code Playgroud)

MyItemTwo.qml

import QtQuick 2.0

Rectangle {
   id: myItem
   signal changeToFirst()

   width: 100; height: 100

   MouseArea {
       anchors.fill: parent
       onClicked: myItem.changeToFirst()
   }
}
Run Code Online (Sandbox Code Playgroud)

有人知道如何使用 loader 来实现此目的,或者 loader 不应该用于此目的?

arh*_*hzu 2

MyItemOne.qml如果我使用(Qt5.6.0)的初始值,你的代码工作正常myLoader.source。但是,它会打印出警告:

QML Connections: Cannot assign to non-existent property "onChangeToFirst"
Run Code Online (Sandbox Code Playgroud)

发生这种情况是因为 MyItemOne没有定义changeToFirst信号。ignoreUnknownSignals元素的属性可Connections用于抑制警告,或者两个屏幕应定义同一组信号。

Loader如果切换时前一个视图始终完全卸载并不重要,则可以使用。