我的 Blackberry 10 Cascades(C++、Qt 和 QML)示例应用程序在启动时崩溃并出现以下错误

Posted

技术标签:

【中文标题】我的 Blackberry 10 Cascades(C++、Qt 和 QML)示例应用程序在启动时崩溃并出现以下错误【英文标题】:My Blackberry 10 Cascades (C++, Qt & QML) sample app is crashing on startup with the following error 【发布时间】:2012-09-18 16:07:14 【问题描述】:

我正在尝试在 QNX Momentics IDE 中使用 C++、Qt 和 QML 制作示例 Blackberry 10 Cascades 应用程序,并在 Blackberry 10 Dev Alpha Simulator 中运行它。当我开始运行它时,我收到以下错误消息:

ApplicationPrivate::declarativeEngine:从非 UI 线程 QThread(0x8067e48) 调用的错误 ApplicationPrivate::declarativeEngine: 从非 UI 线程调用的方法

我已经尝试在谷歌上搜索这些错误消息 - 但我只找到了一些实际适用于我的情况的链接 - 这些问题的解决方案似乎不适用于我。

我知道这与我试图从不同的 qml 文档中调用不同的类有关。 (这是我之前遇到的问题 - 这就是我首先制作这个示例应用程序的原因 - 看看我是否可以弄清楚如何从不同的 qml 文档中调用不同的类)。

这是我的示例应用程序的代码。有 7 个文件(main.qmlmain.cppapp.cppapp.hppPage2.cppPage2.hPage2.qml)。如果有人能帮我解决这个问题,我将不胜感激 - 因为我不确定我做错了什么。

谢谢。

(我已经删除了main.cpp并将其他6个文件中的代码减少到我认为是这个问题的关键部分)。

我知道问题与我的Page2 类和Page2.qml 文件有关。

(我认为问题是我必须做一些事情才能从多个 qml 文件中调用 qt 代码 - 我只是不知道那是什么)。

main.qml:


import bb.cascades 1.0

//-- create one page with a label and text
Page 
    content: Container 
        Button 
            text: "Page 2"
            onClicked: app.goToPage2
        
    


来自app.cpp


App::App()

    qmlRegisterType<App>("GDLiteBB", 1, 0, "app");
    qmlRegisterType<Page2>("GDLiteBB", 1, 0, "Page2");

    QmlDocument *qml = QmlDocument::create("main.qml");
    qml->setContextProperty("app", this);

    AbstractPane *root = qml->createRootNode<AbstractPane>();
    Application::setScene(root);


void App::goToPage2() 
    Page2::getInstance();


来自app.hpp


class App : public QObject

    Q_OBJECT
public:
    App();

    Q_INVOKABLE void goToPage2();
;

Page2.cpp


QmlDocument * Page2::qml_ = QmlDocument::create("Page2.qml");
AbstractPane * Page2::root_ = qml_->createRootNode<AbstractPane>();
Label * Page2::label_ = root_->findChild<Label *>("label");

Page2::Page2() : QObject() 
    ++count_;
    page2_ = this;
    qml_->setContextProperty("Page2", this);
    Application::setScene(root_);


Page2 *Page2::getInstance() 
    return page2_ ? page2_ : new Page2();


void Page2::setLabel() 
    label_->setText("This is page 2");


Page2.h


class Page2 : public QObject 
    Q_OBJECT

    static Page2 *page2_;
    static unsigned int count_;

    static bb::cascades::QmlDocument *qml_;
    static bb::cascades::AbstractPane *root_;
    static bb::cascades::Label *label_;

    Page2();
public:
    static Page2 *getInstance();
    virtual ~Page2();

    Q_INVOKABLE void setLabel();
;

Page2.qml


import bb.cascades 1.0
import GDLiteBB 1.0

Page 
    content: Container 
        Button 
            text: "Set Label"
            onClicked: Page2.setLabel()
        
        Label 
            objectName: "Label"
        
    

【问题讨论】:

请尝试简化您的代码,直到错误消失,或者它是一个仍然重现您的问题的最小示例。这里没有人愿意阅读与问题无关的所有代码部分。 Mic_e => 我已经取出 main.cpp 并将其他 6 个文件中的代码减少到我认为是解决这个问题的关键部分。 【参考方案1】:

我认为您的问题是以下几行:

QmlDocument * Page2::qml_ = QmlDocument::create("Page2.qml");
AbstractPane * Page2::root_ = qml_->createRootNode<AbstractPane>();
Label * Page2::label_ = root_->findChild<Label *>("label");

一旦应用程序代码加载到内存中,这些对象就会被创建,这意味着它发生在main() 中的事件循环开始之前。所有继承自 QObject 的类都需要在事件循环开始后创建,在事件循环结束前销毁。

【讨论】:

以上是关于我的 Blackberry 10 Cascades(C++、Qt 和 QML)示例应用程序在启动时崩溃并出现以下错误的主要内容,如果未能解决你的问题,请参考以下文章

Blackberry 10 Cascades、qml (C++ & QT) 中的布局存在问题

无法在 BlackBerry Cascades 中通过 https 加载 JSON 数据源

BlackBerry Cascades:如何将数据加载到 ListView

如何在 Blackberry Cascades qml 和 qt 中点击列表项组件

如何在 Cascades、Blackberry 10 中使用 Qt/QML/C++ 从另一个 qml 文件中更改一个 qml 文件中的标签文本?

Blackberry Cascades 上下文菜单从按钮单击