我的 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.qml
、main.cpp
、app.cpp
、app.hpp
、Page2.cpp
、Page2.h
、Page2.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 文件中的标签文本?