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