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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 !