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.qmlmain.cppapp.cppapp.hppPage2.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 に答える