当一个屏幕在另一个屏幕之上启动时,黑莓 10 单击事件不会触发
Blackberry 10 click event not trigger when one screen launch on top of other
FirstScreen.hpp
FirstScreen.cpp
void FirstScreen:: launchSecondScreen(){
SecondScreen secondScreen;
}
firstscreen.qml
Page {
Container {
Button {
onClicked: {
//Launch second screen
console.log("This will print")
_app.launchSecondScreen();
}
}
}
}
SecondScreen.hpp
SecondScreen.cpp
void SecondScreen:: launchThirdScreen(){
ThirdScreen thirdScreen;
}
secondscreen.qml
Page {
Container {
Button {
onClicked: {
//Launch third screen
console.log("This will not print")
_app.launchThirdScreen();
}
}
}
}
当我在第一个点击事件之上启动第二个屏幕时,会发生什么情况?请通过 link 完成项目 https://github.com/amityadav1984/BB10MultiscreenIssue
因此我必须使用 NavigationPane。
感谢您提供 Minimal, Complete, and Verifiable example,它确实有助于获取测试和复制所需的所有信息。
首先,让我解释一下发生了什么,然后我将解释如何修复它。
它不起作用的原因:
您正在方法中创建 Screen2
对象,该对象将在方法结束时被删除。所以基本上,您在 Screen1
上,您单击触发 launchScreen2
方法的按钮,此方法创建一个 Screen2
对象,将新视觉对象设置为 Screen2.qml
并且然后方法在退出前删除 Screen2
对象。当您单击 Screen2.qml
页面上的按钮时,_app
上下文不再存在。
那为什么它在 main.cpp
中与 Screen1
一起工作呢?因为main.cpp
会在方法结束前进入主事件循环,所以Screen1
直到主事件循环结束(app退出)才会被删除。
如何修复:
1) 创建 Screen2
作为指针 :
Screen2* screen2 = new Screen2();
虽然这会奏效,但请注意,您有责任在用完对象后将其删除,否则会发生内存泄漏。一个好的做法是尽可能设置父级,这样你就可以确定如果父级被删除,所有的子级也会被删除。
screen2->setParent(this);
当然,虽然设置 parent 是一个好习惯,但更好的做法是在不再需要任何对象时立即删除它们,从而尽可能减少内存占用。
2) 在Screen1.hpp
中声明Screen2
为私有变量,使其成为全局变量。
请注意,通过这样做,您需要将 Screen2
构造函数中的代码移动到您必须在 Screen1::launchScreen2()
中调用的 public 方法中,例如 screen2.setScene()
.
如果您需要更多信息,请告诉我。
FirstScreen.hpp
FirstScreen.cpp
void FirstScreen:: launchSecondScreen(){
SecondScreen secondScreen;
}
firstscreen.qml
Page {
Container {
Button {
onClicked: {
//Launch second screen
console.log("This will print")
_app.launchSecondScreen();
}
}
}
}
SecondScreen.hpp
SecondScreen.cpp
void SecondScreen:: launchThirdScreen(){
ThirdScreen thirdScreen;
}
secondscreen.qml
Page {
Container {
Button {
onClicked: {
//Launch third screen
console.log("This will not print")
_app.launchThirdScreen();
}
}
}
}
当我在第一个点击事件之上启动第二个屏幕时,会发生什么情况?请通过 link 完成项目 https://github.com/amityadav1984/BB10MultiscreenIssue
因此我必须使用 NavigationPane。
感谢您提供 Minimal, Complete, and Verifiable example,它确实有助于获取测试和复制所需的所有信息。
首先,让我解释一下发生了什么,然后我将解释如何修复它。
它不起作用的原因:
您正在方法中创建 Screen2
对象,该对象将在方法结束时被删除。所以基本上,您在 Screen1
上,您单击触发 launchScreen2
方法的按钮,此方法创建一个 Screen2
对象,将新视觉对象设置为 Screen2.qml
并且然后方法在退出前删除 Screen2
对象。当您单击 Screen2.qml
页面上的按钮时,_app
上下文不再存在。
那为什么它在 main.cpp
中与 Screen1
一起工作呢?因为main.cpp
会在方法结束前进入主事件循环,所以Screen1
直到主事件循环结束(app退出)才会被删除。
如何修复:
1) 创建 Screen2
作为指针 :
Screen2* screen2 = new Screen2();
虽然这会奏效,但请注意,您有责任在用完对象后将其删除,否则会发生内存泄漏。一个好的做法是尽可能设置父级,这样你就可以确定如果父级被删除,所有的子级也会被删除。
screen2->setParent(this);
当然,虽然设置 parent 是一个好习惯,但更好的做法是在不再需要任何对象时立即删除它们,从而尽可能减少内存占用。
2) 在Screen1.hpp
中声明Screen2
为私有变量,使其成为全局变量。
请注意,通过这样做,您需要将 Screen2
构造函数中的代码移动到您必须在 Screen1::launchScreen2()
中调用的 public 方法中,例如 screen2.setScene()
.
如果您需要更多信息,请告诉我。