Qt quick如何连接来自不同文件的信号和插槽

Qt quick how to connect signal and slots from different file

我是 QML 新手。 我想将来自 .qml 文件的信号连接到另一个 .qml 中的插槽。 问题是我没有实例化该文件中的对象,因为我想在 main.qml 中使用 StackView 在屏幕上查看该 .qml 文件中的对象。

在 main.qml 我有:

    StackView {
        id: mStackId
        anchors {
            top: topSectionId.bottom
            bottom: parent.bottom
            left: parent.left
            right: parent.right
        }

        initialItem: homePage
    }

    Component {
        id: homePage
        Home {id: homePageObj}
    }

    Component {
        id: housePage
        House {id: housePageObj}
    }

    Component {
        id: createRoomPage
        CreateRoom {id: createRoomPageObj}
    }

其中 Home、House 和 CreateRoom 是我想要连接的 .qml 文件。 我试过:

  Component.onCompleted:
    createRoomPage.newRoom.connect(homePage.createNewRoom)

其中 newRoom 是信号,createNewRoom 是槽,但是 Qt Creator 给我错误:

TypeError: Cannot call method 'connect' of undefined

我也尝试过使用 createRoomPageObj 而不是 createRoomPage 和 homePageObj 而不是 homePage 但我收到错误:

ReferenceError: createRoomPageObj is not defined

我读过我可以使用 Connections,但文档对我来说不是很清楚。

这不是 Connections 用法错误的问题,只是 createRoomPage 没有被实例化。您需要一个可以执行逻辑并可以从视图连接到的后端。

以最简单的形式,您可以制作 QtObject

QtObject {
    id: backend

    signal newRoom(name)
}

StackView {
    ...
}

您可以使用 CreateRoomPage 中的 backend.newRoom("Kitchen")


关于持久性问题后编辑

您还可以将 QObject 创建为单例:

pragma Singleton

import QtQuick 2.4

QtObject {
    signal newRoom(name)
}

在这种情况下,文件名将决定程序其余部分使用的名称。所以如果上面的一段代码命名为Backend.qml,你可以这样使用:

Connections {
    target: Backend
    function onNewRoom(name) { .... }
}