2

我正在尝试在 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.qml, main.cpp, app.cpp, app.hpp, Page2.cpp, Page2.h, Page2.qml)。如果有人能帮我解决这个问题,我将不胜感激 - 因为我不确定我做错了什么。

谢谢你。

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

我知道这个问题与我的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"
        }
    }
}
4

1 回答 1

0

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

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

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

于 2013-04-11T18:32:42.907 回答