I am trying to switch between multiple screens using stackview in QML. I am following this example. It is working fine till switching from screen 1 to screen 2. But while switching from screen 2 to screen 1, the signal is not getting invoked.
main.qml
import QtQuick
import QtQuick.Controls
import '../imports/Test'
import QtQuick.Controls.Material 2.15
ApplicationWindow {
id: mainframe
width: Screen.desktopAvailableWidth
height: Screen.desktopAvailableHeight
visible: true
title: qsTr("Dr. T")
Material.theme: Material.Dark
StackView {
id: stack_view
initialItem: loginWin
anchors.fill: parent
Test_interface_dark {
id: test_screen
onAnalyzeReport: {
stack_view.pop()
stack_view.push('./Report_screen.qml')
}
}
Second_screen {
id: search_screen
onSearchRegister: {
console.log('Test signal Invoked')
// stack_view.pop()
stack_view.push('./Test_interface_dark.qml')
stack_view.initialItem = test_screen
}
}
Login_dark {
id: loginWin
onLoggedIn: {
// stack_view.pop()
console.log(stack_view)
stack_view.push("./Second_screen.qml")
}
}
}
}
Login_dark.qml
Item {
id: login_item
anchors.fill: parent
signal loggedIn()
Rectangle {
id: rectangle
color: "#494949"
anchors.fill: parent
state: ""
Button {
if (condition) {
login_item.loggedIn()
}
}
}
}
similar are Second_screen.qml and Test_interface_dark.qml. But when I try to invoke signal searchRegister from Secondscreen.qml, it does not work, the line console.log('Test signal Invoked')
in main.qml also does not get printed.
If you want to override properties or handling signals within components,
Don't add them with path to the StackView
.
Instead create components that incubate your other components with the overridden properties inside your StackView
QML file.
Example:
import QtQuick
import QtQuick.Controls
import QtQuick.Controls.Material 2.15
ApplicationWindow {
id: root
width: 500
height: 500
title: qsTr("Dr. T");
visible: true
Material.theme: Material.Dark
StackView {
id: stack_view;
initialItem: loginWin;
anchors.fill: parent;
Component{ id: loginWin;
LoginDark {
onLoggedIn: {
console.log("to search_screen");
stack_view.push(search_screen);
}
}
}
Component{ id: search_screen;
SecondScreen {
onSearch: {
console.log("Test signal Invoked")
stack_view.push(interface_)
}
}
}
Component{ id: interface_;
InterfaceDark {
onAnalyzeReport: {
stack_view.pop()
}
}
}
}
}
Full example can be found here.