Bienvenue sur le forum !

Si vous souhaitez rejoindre la communauté, cliquez sur l'un de ces boutons !

Qt 5 : 5.9.1 - Qt Creator : 4.4.0 - Qt Installer : 2.0.3 - JOM : 1.1.2 - Qt Build suite : 1.7.0 - VS Qt 5 : 2.0.0

Questions d'un débutant !

August 2016 modifié dans Qt / Mobile
Bonsoir,

J'essaye de codr une petite application pour Android mais je patauge sévèrement. Si j'ai bien compris lorsque l'on code pour Android et que l'on veut une interface utilisable sous plusieurs devices différents (donc scalable et tout et tout) il est obligatoire d'utiliser QML. Bon, pourquoi pas. Seulement je suis un peu choqué par ce truc, de ce que j'ai vu on mélange code et définition d'interface ? Ou alors j'ai fais n'importe quoi... J'ai mis en place un genre de dialogue entre une classe C++ et l'interface via un objet partagé mais ça tient un peu du bricolage je trouve.

Existe il une façon de travailler comme avec les widget ?
A part ça, je voudrais utiliser une map (google ou autre) et pouvoir la manipuler (ajouter des markers, tracer des chemins, ce genre de chose) mais je n'ai pas trouvé ce composant d'office. Je me pose également la question de la portabilité, comment se comporte Qt sous iOs ?

Si vous avez sous la main un bon tuto ou mieux une application android très simple avec une map pour me servir d'exemple je suis preneur ! J'ai bien sur remarqué l'exemple de Qt avec un map OSM mais je n'y comprend pas grand chose et l'exemple semble reposer sur un fournisseur pour les maps. A creuser quoi !

Merci d'avance !

Réponses

  • Bonjour,
    Je vais essayer de répondre avec ce que je connais du qml, car je n'en fais que très peu.
    Le qml me semble incontournable pour le développement mobile, j'ai essayé de faire une application widgets pour android et quand j'ai vu le résultat, j'ai dû mis mettre. Donc pour une appli ergonomique et moderne, oui le qml est fait pour ça.
    Mais si tu ne maîtrise pas bien le javascript, tu peux effectivement coder l'intelligence en c++ et utiliser le qml pour l'interface.
    Le lien entre les 2 n'est pas forcément du bricolage ;)
    Il faut ajouter ta classe c++ au contexte et utiliser Q_INVOKABLE et Q_PROPERTY.
    je te conseille de lire doc.qt.io/qt-5/qtqml-cppintegration-exposecppattributes.html

    Pour interfacer google maps, je pourrais pas aider car je sais juste qu'il faut s'enregistrer pour utiliser leur API, et que tu peux utiliser l'élément WebView. Après pour utiliser l'API, faudra faire du javascript je pense
  • J'ai mis en place un genre de dialogue entre une classe C++ et l'interface via un objet partagé mais ça tient un peu du bricolage je trouve.
    Il faut voir comment tu as fait les choses, mais comme tu as d'un côté un langage compile et de l'autre un langage interprété, il faut bien mettre en place un système de communication entre les 2 un moment donné.
    Existe il une façon de travailler comme avec les widget ?
    C'est a dire ?
    A part ça, je voudrais utiliser une map (google ou autre) et pouvoir la manipuler (ajouter des markers, tracer des chemins, ce genre de chose) mais je n'ai pas trouvé ce composant d'office.
    Dans QtLocation > Mapping.
    Il y a différent fournisseurs de mapping (OSM, HERE, Mapbox, et bientot ESRI dans Qt 5.8). Je crois que aucun de ces services ne gere le mapping offline dans Qt (ESRI propose un SDK plus complet qui contient le mapping offline, les autres je ne sais pas).

    Google Map n'est pas pris en charge par Qt par défaut, pour des raisons legales de Google. Mais il existe des projets GitHub pour cela.
    Je me pose également la question de la portabilité, comment se comporte Qt sous iOs ?
    C'est un garcon bien eleve, il se comporte bien.
    Si vous avez sous la main un bon tuto ou mieux une application android très simple avec une map pour me servir d'exemple je suis preneur ! J'ai bien sur remarqué l'exemple de Qt avec un map OSM mais je n'y comprend pas grand chose et l'exemple semble reposer sur un fournisseur pour les maps.
    Dans Qt Creator > le mode "Accueil" > le bouton "Exemples" > fais une recherche avec "location". Tu auras des exemples de code, en particulier "mapviewer". Mais c'est peut être ce que tu as déjà trouvé comme code d'exemple ?
    Regarde aussi dans la doc de Qt Location.
  • Merci à vous deux de vos réponses !

    babaOroms : Pour la communication j'ai effectivement créer une classe dérivée de QObject avec des méthode Q_INVOKABLE et une Q_PROPERTY pour tester. J'ai ensuite ajouté une instance de cette classe au contexte.

    En fait quand je dis vouloir travailler avec l'interface QML comme avec les Widget j’entends par là déposer mes éléments d'interface dans le designer, faire un clic droit sur un élément (prenons l'exemple d'un bouton) et aller sur son événement OnClick() et me retrouvé dans mon code C++. Je dois comprendre que c'est impossible ?

    Autre chose, pour QtLocation, j'ai bien fait l'importation (import QtLocation 5.7) mais je n'ai rien de plus dans le designer. C'est une erreur ou alors est ce normal ? Il faut se passer du designer avec ce genre d'élément et tout faire à la main ?

    gbdivers : C'est bien l'exemple auquel je ne comprenais rien :) C'est certainement du à mon ignorance de QML ! Je vais l'éplucher plus méthodiquement.
    En fait pour iOs, je me demandais quelles étaient les différence de support avec Android. Si différences il y a bien entendu !

    Merci encore.
  • peut tu partager le code de ta classe?
    Merci.
    Car j'ai moi même le même problème.
  • Bonsoir !
    Merci de faire en sorte que le titre du fil soit un résumé du problème évoqué.
  • August 2016 modifié
    PapaJaac : Désolé ! J'ai essayé de le modifier mais je n'ai plus l'option.
    arnold : Bien sur, le .h :
    #ifndef COMCPP_H
    #define COMCPP_H

    #include <QObject>
    #include <QColor>
    #include <QString>

    class ComCpp : public QObject
    {
    Q_OBJECT

    private:
    Q_PROPERTY(int _Count MEMBER count);

    int count;

    public:
    ComCpp() { count = 0;}
    Q_INVOKABLE QString txt();
    Q_INVOKABLE int _count() { return count; }
    };

    #endif // COMCPP_H
    Le .cpp :
    #include "comcpp.h"

    QString ComCpp::txt(){
    QString r = "count : " + QString::number(count);
    count++;
    return r;
    }
    Mon main :
    #include <QGuiApplication>
    #include <QQmlApplicationEngine>
    #include "comcpp.h"
    #include <QDebug>
    #include <QQmlContext>
    int main(int argc, char *argv[])
    {
    ComCpp a;

    QGuiApplication app(argc, argv);
    //ComCpp::declareQML(); // des test d'une autre méthode très similaire
    //qmlRegisterType<ComCpp>("MyLib", 1, 0, "ComCpp");
    QQmlApplicationEngine engine;
    engine.rootContext()->setContextProperty("ComCpp", &a);
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));

    return app.exec();
    }
    Mon .qml :
    import QtQuick 2.2
    import QtQuick.Window 2.2
    import QtLocation 5.7
    import Qt.labs.calendar 1.0
    import QtGraphicalEffects.private 1.0
    import QtPositioning 5.7
    import QtQuick.Controls 2.0
    import QtQuick.Extras 1.4
    import QtQuick.Layouts 1.3
    import QtQuick.Templates 2.0
    //import MyLib 1.0

    Window {
    id: wind
    visible: true
    width: 640
    height: 480
    title: qsTr("Bac à sable android")
    color: "#ff0000"


    MouseArea {
    id: mouseArea2
    anchors.fill: parent

    onClicked: {
    ComCpp._Count = 0;
    }
    }



    Rectangle {
    id: buttonRect
    color: "blue"
    anchors.centerIn: parent
    width: text1.width +10
    height: text1.height +10

    Text {
    id: text1
    text: qsTr("Text")
    horizontalAlignment: Text.AlignHCenter
    font.pixelSize: 19
    anchors.centerIn: parent

    }

    MouseArea {
    id: mouseArea1
    anchors.fill: parent
    onPressed: {
    buttonRect.color = "purple"
    }

    onClicked: {
    if (wind.color == "#ff0000") {
    wind.color = "#ff9900"
    text1.text = qsTr("plop")
    buttonRect.color = "blue"
    } else {
    wind.color = "#ff0000";
    text1.text = ComCpp.txt() + ComCpp._count() + ComCpp._Count;
    buttonRect.color = "yellow"
    }

    }

    // fin mouse area

    }

    // fin buttonrect

    }


    //ComCpp { id: comCpp } // des restes d'une autre méthode

    }
    C'est à peu prêt tout, je n'arrive plus à trouvé le tuto qui m'a servi mais il est sur le developpez.com.
    J'ai récupérer le count de ma classe de trois façons pour tester un peu et j'ai été surpris de pouvoir le récupérer en accedant directement alors qu'il est en private, ça devrait être impossible non ? Enfin ma formation C++ est d'un autre âge alors bon je me goure peu être.

    PS : Mon code prend pas mal de place, j'espère que la modération le tolèrera. J'ai chercher sans succès une balise spoil.

    Edit : En regardant mieux je me suis aperçu que j'avais écris ComCpp._Count au lieu de ComCpp.count, en faisant la modification j'ai bien un retour indéfini. Par contre je ne m'explique pas comment la syntaxe ComCpp._Count a pu fonctionner... Un appel à la fonction _count() mais sans parenthèses et avec une majuscule Oo ?
Connectez-vous ou Inscrivez-vous pour répondre.