我正在尝试在 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"
}
}
}