Пример моего приложения Blackberry 10 Cascades (C ++, Qt & amp; QML) при запуске вылетает со следующей ошибкой

Я пытаюсь сделать пример приложения Blackberry 10 Cascades на C ++, Qt, & QML в QNX Momentics IDE и запустите его в Blackberry 10 Dev Alpha Simulator. Когда я запускаю его, я получаю следующие сообщения об ошибках:

ApplicationPrivate :: DeclarativeEngine: ОШИБКА, вызванная из потока, не являющегося пользовательским интерфейсом QThread (0x8067e48)
ApplicationPrivate :: DeclarativeEngine: метод, вызываемый из потока, не являющегося пользовательским интерфейсом

Я попытался погуглить эти сообщения об ошибках — но я нашел только несколько ссылок, которые действительно применимы к моей ситуации — и решения для этих проблем, похоже, не относятся ко мне.

Я знаю, что это как-то связано со мной, когда я пытаюсь вызывать разные классы из разных документов qml. (С чем у меня были проблемы раньше — именно поэтому я и создал этот пример приложения — чтобы узнать, смогу ли я выяснить, как вызывать разные классы из разных документов qml).

Вот код моего примера приложения. Есть 7 файлов (main.qml, main.cpp, app.cpp, app.hpp, Page2.cpp, Page2.h, Page2.qml). Я был бы очень признателен, если бы кто-нибудь мог помочь мне решить эту проблему — потому что я не совсем уверен, что я делаю неправильно.

Спасибо.

(Я вынул main.cpp & сократил код из других 6 файлов до того, что я считаю ключевыми частями этой проблемы).

Я знаю, что проблема как-то связана с моим Page2 класс и Page2.qml файл.

(Я думаю, проблема в том, что я должен что-то сделать, чтобы иметь возможность вызывать qt-код из более чем одного qml-файла — и я просто не знаю, что это такое).

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"}
}
}

2

Решение

Я думаю, что ваша проблема заключается в следующих строках:

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

Эти объекты создаются, как только код приложения загружается в память, что означает, что это происходит до запуска цикла событий в main(), Все классы, которые наследуются от QObject, должны быть созданы после запуска цикла событий и уничтожены до его окончания.

0

Другие решения

Других решений пока нет …