Soucis avec la doc officielle de Qt 5.0 "Exposing Attributes of C++ Types to QML"
Bonjour,
Je souhaite développer une application graphique en Qt 5 visant à créer une liste d'éléments en C++ et à afficher celle ci en QML.
J'ai suivi la doc "Exposing Attributes of C++ Types to QML" du site qt-project.org, mais j'ai un soucis au niveau de la déclaration de la vue.
Je m'explique, j'en suis au stade où je souhaite simplement exposer au QML un seul objet, et non toute une liste.
J'ai créé ma classe message, mon main et ma fenêtre qml :
message.h
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| #ifndef MESSAGE_H
#define MESSAGE_H
#include <QObject>
class Message : public QObject
{
Q_OBJECT
Q_PROPERTY(QString author READ author WRITE setAuthor NOTIFY authorChanged)
public:
Message(QString const& msg="") : m_author(msg) {}
void setAuthor(const QString &a) {
if (a != m_author) {
m_author = a;
emit authorChanged();
}
}
QString author() const {
return m_author;
}
signals:
void authorChanged();
private:
QString m_author;
};
#endif // MESSAGE_H |
main.cpp
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| #include <QtGui/QGuiApplication>
#include "qtquick2applicationviewer.h"
#include "message.h"
#include <QQmlContext>
#include <QQmlEngine>
#include <QQmlComponent>
int main(int argc, char *argv[])
{
QCoreApplication app(argc, argv);
Message msg("Toto");
QQmlEngine engine;
engine.rootContext()->setContextProperty("message", &msg);
QQmlComponent component(&engine, QUrl::fromLocalFile("main.qml"));
component.create();
return app.exec();
} |
main.qml
Code:
1 2 3 4 5 6 7 8 9 10
| import QtQuick 2.0
Rectangle {
width: 360
height: 360
Text {
text: message.author
anchors.centerIn: parent
}
} |
Ces trois fichiers sont les même que ceux exposés dans la doc, mais à l'exécution ça ne marche pas ! A la compilation QQmlComponent: Component is not ready s'affiche et ma fenêtre ne s'ouvre pas.
Ce que je ne comprends pas c'est qu'en utilisant la méthode suivante dans le main.cpp :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| #include <QtGui/QGuiApplication>
#include "qtquick2applicationviewer.h"
#include "message.h"
#include <QQmlContext>
#include <QQmlEngine>
#include <QQmlComponent>
int main(int argc, char *argv[])
{
QGuiApplication app(argc, argv);
Message msg("Toto");
QtQuick2ApplicationViewer viewer;
viewer.rootContext()->setContextProperty("message", &msg);
viewer.setMainQmlFile(QStringLiteral("qml/TestQt5Quick2/main.qml"));
viewer.showExpanded();
return app.exec();
} |
Tout marche très bien !!! Je cherche donc à comprendre la différence entre ces deux méthodes, et pourquoi celle qui est dans la doc officielle ne marche pas... Il doit s'en doute me manquer quelque chose, mais après de nombreux essais je ne trouve pas.
Merci d'avance !