La aplicación de muestra de mi Blackberry 10 Cascades (C++, Qt y QML) falla al iniciarse y muestra el siguiente error

Estoy tratando de crear una aplicación Blackberry 10 Cascades de muestra en C++, Qt y QML en QNX Momentics IDE y ejecutarla en Blackberry 10 Dev Alpha Simulator. Cuando comienzo a ejecutarlo, recibo los siguientes mensajes de error:

ApplicationPrivate::declarativeEngine: ERROR llamado desde un hilo que no es de UI QThread(0x8067e48) ApplicationPrivate::declarativeEngine: Método llamado desde un hilo que no es de UI

Intenté buscar en Google esos mensajes de error, pero solo encontré algunos enlaces que realmente se aplican a mi situación, y las soluciones para esos problemas no parecen aplicarse a mí.

Sé que tiene algo que ver conmigo tratando de llamar a diferentes clases de diferentes documentos qml. (Que es algo con lo que estaba teniendo problemas antes, razón por la cual hice esta aplicación de muestra en primer lugar, para ver si podía descubrir cómo llamar a diferentes clases desde diferentes documentos qml).

Aquí está el código de mi aplicación de muestra. Hay 7 archivos (main.qml, main.cpp, app.cpp, app.hpp, Page2.cpp, Page2.h, Page2.qml). Agradecería mucho si alguien pudiera ayudarme a resolver esto, porque no estoy muy seguro de lo que estoy haciendo mal.

Gracias por su atención.

(he sacado main.cpp & reduje el código de los otros 6 archivos a lo que creo que son las partes clave de este problema).

Sé que el problema tiene algo que ver con mi Page2 clase y la Page2.qml archivo.

(Creo que el problema es que hay algo que tengo que hacer para poder llamar al código qt desde más de un archivo qml, y simplemente no sé qué es).

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

del 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();
}

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

preguntado el 18 de septiembre de 12 a las 17:09

Intente simplificar su código hasta que el error desaparezca o sea un ejemplo mínimo que aún reproduzca su problema. Aquí nadie querrá leer todas las secciones de código que son irrelevantes para el problema. -

Mic_e => Saqué main.cpp y reduje el código de los otros 6 archivos a lo que creo que son las partes clave de este problema. -

1 Respuestas

Creo que tu problema son estas líneas:

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

Estos objetos se crean tan pronto como el código de la aplicación se carga en la memoria, lo que significa que sucede antes de que comience el ciclo de eventos. main(). Todas las clases que heredan de QObject deben crearse después de que comience el ciclo de eventos y destruirse antes de que finalice el ciclo de eventos.

Respondido 11 Abr '13, 19:04

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.