获取黑莓10应用程序中的活动导航页面

时间:2013-10-08 15:40:38

标签: c++ qt blackberry blackberry-10 blackberry-cascades

我正在制作一个带有QML / c ++第一页的应用程序,导航窗格是用qml创建的。 然后第二页也是qml。 在按下第一页的按钮时,调用c ++函数并解析第二页并且必须推送到导航页面。 我在按钮按下时所做的事情如下所述。

QmlDocument *qml = QmlDocument::create("asset:///home.qml");
    if (!qml->hasErrors()) {
        Page *homepage = qml->createRootObject<Page>();
        if (homepage) {
            qDebug() <<"created a homepage";
            navPane->push(homepage);
        }}

但是当完成推送时,应用程序会自动终止并发出错误。

控制台输出是(创建了一个主页

过程304619722(Sampleapp2)终止SIGSEGV代码= 1 fltno = 11 ip = 78f0a210(/base/usr/lib/libbbcascades.so.1@_ZNK2bb8cascades14NavigationPane7indexOfEPNS0_4PageE+0x707)mapaddr = 0010a210。 REF = 00000010 )

我正在解析指向第二个c ++文件构造函数的导航页面指针,并将其指定给this-&gt; navpange变量。

我应该在第一个c ++文件头中公开导航窗格吗?如果是这样怎么办?

无论如何,我可以从第二个c ++文件获取正在运行的应用程序的活动导航窗格而不进行解析吗?

提前致谢: - )

我是否必须进行导航

2 个答案:

答案 0 :(得分:0)

根据给出的代码,我假设主页未初始化。

答案 1 :(得分:0)

来自黑莓论坛的Zemy回答了我。归功于他。

我认为最简单的方法是将NavigationPane作为QML中的参数传递:

Q_INVOKABLE void function(NavigationPane *pane);
...
pane->push(homepage);

在QML中:

_app.function(navPaneId)

但是这出错了。泽米再次修好了它。

我试图重现这个并且也得到了相同的错误消息。似乎NavigationPane未在Cascades中正确注册。

添加qmlRegisterType()修复它:

ApplicationUI::ApplicationUI(bb::cascades::Application *app) :
        QObject(app)
{
    // prepare the localization
    m_pTranslator = new QTranslator(this);
    m_pLocaleHandler = new LocaleHandler(this);
    if(!QObject::connect(m_pLocaleHandler, SIGNAL(systemLanguageChanged()), this, SLOT(onSystemLanguageChanged()))) {
        // This is an abnormal situation! Something went wrong!
        // Add own code to recover here
        qWarning() << "Recovering from a failed connect()";
    }
    // initial load
    onSystemLanguageChanged();

    //--------------------------------------
    qmlRegisterType<NavigationPane>(); <---------------- ADDED
    //--------------------------------------

    // Create scene document from main.qml asset, the parent is set
    // to ensure the document gets destroyed properly at shut down.
    QmlDocument *qml = QmlDocument::create("asset:///main.qml").parent(this);
    qml->setContextProperty("_app", this);

    // Create root object for the UI
    AbstractPane *root = qml->createRootObject<AbstractPane>();

    // Set created root object as the application scene
    app->setScene(root);
}