当一个屏幕在另一个屏幕之上启动时,黑莓 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().

如果您需要更多信息,请告诉我。