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) { .... }
}
我是 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) { .... }
}