Débutant C++, Structure de base Qt 5.5
Répondre à la discussion
Affichage des résultats 1 à 12 sur 12

Débutant C++, Structure de base Qt 5.5



  1. #1
    crokrodil

    Exclamation Débutant C++, Structure de base Qt 5.5


    ------

    Bonjour,

    je pense que le sujet a déjà dû être traité mais je ne parviens pas à trouver ce que je cherche...

    Mon problème c'est que jusqu'à maintenant je me suis focalisé sur le C "bas niveau" sur des microcontrôleurs, donc niveau interruption, registres, manipulation des types, variables locales et globales... je maitrise à peu près.
    Comme je compte passer sur des microcontrôleurs plus puissants (STM32F7 de chez ST Microelectronics), je voudrais m'amuser avec le C++ (dans un premier temps sur PC avant l'export sur micro)
    Le problème c'est que j'y connais rien, je débute avec les classes, les déclarations privées, publiques, signaux, slots... et je suis un peu perdu.

    Je ne trouve pas de programme d'exemple complets pour des fonctions simples : Ce que je cherche, c'est un projet complet avec une structure "propre" (j'utilise Qt Creator 5.5 avec MinGW).

    J'ai un projet bien précis en tête et sur papier. Celui-ci mettra en oeuvre QTimer, la sauvegarde et la lecture de fichiers XML, la création et la destruction d'objets (graphiques ou non).

    Mais avant cela je dois être sur que la structuration est bonne.

    J'ai fait un petit projet de test pour utiliser QTimer, qui ne fonctionne pas évidemment, sinon ce serait trop facile

    Messages lors de la compilation :
    Starting ...\Qt Projects\build-TEST_Timer-Desktop_Qt_5_5_1_MinGW_32bit-Debug\debug\TEST_Timer.exe...
    Le programme s'est terminé subitement.
    ...\Qt Projects\build-TEST_Timer-Desktop_Qt_5_5_1_MinGW_32bit-Debug\debug\TEST_Timer.exe crashed

    Erreurs lors du debug :
    (!) Cannot open output file debug/TEST_Timer.exe : Permission denied
    (!) Error ID returned 1 exit status


    Ce que j'aimerais faire dans un premier temps, c'est utiliser une ProgressBar qui s'incrémente toutes les secondes.

    Voilà ce que j'ai fait :

    mainwindow.h
    Code:
    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H
    
    #include <QMainWindow>
    #include <QFile>
    #include <QFileInfo>
    #include <QFileDialog>
    #include <QWidget>
    #include <QTimer>
    
    namespace Ui {
    class MainWindow;
    }
    
    class MainWindow : public QMainWindow
    {
        Q_OBJECT
    
    public:
        explicit MainWindow(QWidget *parent = 0);
        ~MainWindow();
    
        QTimer *timer;
        int flash();
    
    private:
        Ui::MainWindow *ui;
    };
    
    #endif // MAINWINDOW_H
    mainwindow.cpp
    Code:
    #include "mainwindow.h"
    #include "ui_mainwindow.h"
    
    int i;
    
    MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
        connect(timer, SIGNAL(timeout()), this, SLOT(flash()));
        timer->start(1000);
    }
    
    MainWindow::~MainWindow()
    {
        delete ui;
    }
    
    // Function called every 1000ms : set in timer->start(1000);
    int MainWindow::flash()
    {
        i++;
        ui->progressBar->setValue(i);
        return 0;
    }
    main.cpp
    Code:
    #include "mainwindow.h"
    #include <QApplication>
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        MainWindow w;
        w.show();
    
        return a.exec();
    }
    Dans l'interface graphique mainwindow.ui j'ai seulement un widget progressBar...

    Est-ce que vous pourriez m'aider à remettre de l'ordre dans tout ça, où est-ce que je dois déclarer le prototype de ma fonction flash() et où est-ce que je dois déclarer la fonction? est-ce qu'il manque des éléments?...

    Merci beaucoup

    -----

  2. #2
    Jack
    Modérateur

    Re : Débutant C++, Structure de base Qt 5.5

    Je doute que commencer à faire du C++ en mode "graphique" soit une bonne idée. Il est préférable à mon avis de faire ses gammes en console.

    De plus, Qt n'est pas un bon choix au vu de ton objectif: je doute que l'utilisation des librairies de Qt puisse être réutilisée avec ton µContrôleur.

    Il te manque encore les bases fondamentales de la portée des variables en C et C++: la variable i de ta méthode flash() est LOCALE. Tu auras beau l'incrémenter, celle-ci perdra sa valeur à la sortie de la fonction. De plus, elle ne possède pas de valeur initiale. Je ne comprends pas que ton compilateur ne l'ait pas signalé.

    Si tu as programmé bas niveau avec interruption, tu as déjà du rencontrer ce cas de figure: il faut déclarer la variable comme "static" et lui donner une valeur initiale.

    En C++, tu aurais pu mettre ce compteur comme attribut de ta classe et l'initialiser dans le constructeur.

    A+

  3. #3
    crokrodil

    Re : Débutant C++, Structure de base Qt 5.5

    Bonjour,

    disons que Qt a l'avantage d'avoir la prise en charge C++, et gère lui-même la partie graphique (il suffit d'ajouter dans le code la façon dont on veut interagir avec les widgets, et il y a un fichier indépendant pour ce qui est graphique), du coup je ne suis pas obligé de faire du graphique mais en revanche je peux manipuler le C++. Je me suis tourné vers celui-ci car :
    - Il est gratuit
    - Non limité en taille de code ou en période d'essai
    - Multiplateforme

    Dans mon exemple j'utilise le widget "progressBar" pour visualiser ce que fait mon code, mais j'aurais pu utiliser le terminal avec "cout" ou "QDebug".

    Quant à la portabilité des fonctions "propriétaires" à vrai dire je ne sais pas, un utilisateur de la carte STM32F4-Discovery a exporté un fichier QML sur la carte et ça semble fonctionner, mais il n'en dit pas d'avantage... Démo ici. Après c'est de la compilation, donc le fichier compilé permet certainement de gérer les bibliothèques de Qt de manière transparente, tout comme le font Arduino et les autres compilateurs C qui ne respectent pas le standard ANSI.

    Dans le pire des cas, Qt me servira sur PC pour différentes choses donc de mon point de vue ce n'est pas une perte de temps En plus pour le moment ce qui m'intéresse c'est la mise en forme du code, savoir où déclarer les fonctions, les variables privées, les variables publiques, et surtout manipuler les classes. Pour le reste des fonctions il y a la doc de Qt.

    Pour mon projet j'ai choisi le C++ uniquement pour une raison : la gestion des objets.

    Petit exemple :

    Je veux créer une classe "personne" :
    - Nom
    - Prénom
    - Age

    J'aurais pu le faire en C avec une structure :
    Code:
    typedef struct //person
    {
    char*lastName;
    char*firstName;
    short int age;
    }PersonStruct;
    Le problème c'est que je ne peux pas créer ou supprimer des personnes comme je le veux. Si je veux créer 12 personnes je suis obligé de procéder ainsi :
    Code:
    PersonStruct person[12];
    person[N].lastName="Nom_N";
    person[N].firstName="Prenom_N";
    person[N].age=Age_N;
    alors qu'avec une classe je pourrais créer autant d'objets que je veux (en théorie) et les détruire par la suite (En fin c'est ce que je crois avoir compris en regardant les différences entre C et C++).
    Et dans un même temps je voudrais apprendre à utiliser les couplages faibles avec les signaux/slots.

    Est-ce qu'on peut déclarer toutes les classes dans un seul fichier ou vaut-il mieux faire un header par class et les inclure ensuite? où est-ce que l'on déclare les connexions entre les signaux et les slots? J'ai aussi vu qu'il était possible de connecter un signal à un autre signal, est-ce que c'est viable?... Voila quelques unes des questions que je me pause...

    Merci

  4. #4
    Jack
    Modérateur

    Re : Débutant C++, Structure de base Qt 5.5

    Pour utiliser Qt avec ton µC, c'est toi qui vois. En revanche, sur PC, Qt est vraiment bien.
    Le problème c'est que je ne peux pas créer ou supprimer des personnes comme je le veux ...... alors qu'avec une classe je pourrais créer autant d'objets que je veux (en théorie) et les détruire par la suite
    J'avoue avoir du mal à te suivre.

    Ce que ne peuvent pas faire les structures en C, c'est avoir des champs constitués de fonctions. Les structures en C++ le peuvent, de même que les classes.
    Si tu veux gérer des personnes, il faut faire des tableaux de personnes ou mieux, en C++ il est conseillé d'utiliser les conteneurs de la STL comme les "vector" ou les "list". Qt possède de même ses propres conteneurs (QVector, QList, etc.).

    Et dans un même temps je voudrais apprendre à utiliser les couplages faibles avec les signaux/slots.
    C'est assez bien document. Un bémol: la fonction "connect" des versions 5 de Qt, bien que plus efficace, me semble plus compliquée à utiliser que celle des versions antérieures.

    J'ai aussi vu qu'il était possible de connecter un signal à un autre signal, est-ce que c'est viable?
    Ca doit être possible, mais en passant par l'intermédiaire d'un slot qui appellera un autre signal. Mais je pense qu'il y a des choses plus basiques à utiliser avant.

  5. A voir en vidéo sur Futura
  6. #5
    lou_ibmix_xi

    Re : Débutant C++, Structure de base Qt 5.5

    Citation Envoyé par Jack Voir le message
    Pour utiliser Qt avec ton µC, c'est toi qui vois. En revanche, sur PC, Qt est vraiment bien.
    Je crois qu'il tourne maintenant sur android, mais il faudra quand même un gros bousin... Mais c'est sûr sur un PC, Qt porte bien son nom, il m'a réconcilier avec le C++.

    Ce que ne peuvent pas faire les structures en C, c'est avoir des champs constitués de fonctions.
    Pourquoi une structure C ne pourrais pas avoir des pointeurs sur fonctions ? C'est plus qu'un exercice de style, c'est utilisé dans le noyau linux, gtk+...

    Ca doit être possible, mais en passant par l'intermédiaire d'un slot qui appellera un autre signal. Mais je pense qu'il y a des choses plus basiques à utiliser avant.
    Si je me rappelle bien (encore), tu es vite obligé par exemple si tu dérive un widget, et que la classe dérivée doit utiliser le signal émis par le widget sans le couper.

  7. #6
    Jack
    Modérateur

    Re : Débutant C++, Structure de base Qt 5.5

    Pourquoi une structure C ne pourrais pas avoir des pointeurs sur fonctions ? C'est plus qu'un exercice de style, c'est utilisé dans le noyau linux, gtk+...
    C'est sur qu'on peut faire des classes avec un peu tout, même de l'assembleur car au bout du compte c'est du langage machine qui tourne.

    Disons que l'utilisation des fonctions dans une classe en C++ est plus simple qu'en C. Mais si on n'a pas le choix, les pointeur de fonction, c'est une solution.
    Dernière modification par Jack ; 18/01/2016 à 20h53.

  8. #7
    crokrodil

    Re : Débutant C++, Structure de base Qt 5.5

    Dans un premier temps je vais me contenter de Qt sur PC, une fois que je serai un peu plus à l'aise je verrai pour porter un petit programme sur ma carte de développement. ça a l'air faisable, mais il faut que je vois comment ça se configure et les limitations.

    Je parlais de "personne" pour que ça soit un exemple concret d'objet à créer ou supprimer, mais mon projet est un petit contrôleur pour une LED Rouge Vert Bleu.
    La LED est reliée sur 3 PWM (signal électrique qui commande commande l'intensité pour chaque couleur) sur 16 bits.

    J'ai 4 octets pour la commander :
    - octet 1 : luminosité (0-255)
    - octet 2 : niveau_rouge (0-255)
    - octet 3 : niveau_vert (0-255)
    - octet 4 : niveau_bleu (0-255)

    La sortie pour chaque couleur est :
    LED Rouge = niveau_rouge * luminosité (8 bits * 8 bits = 16 bits)
    LED Bleue = niveau_bleu * luminosité (8 bits * 8 bits = 16 bits)
    LED Verte = niveau_vert * luminosité (8 bits * 8 bits = 16 bits)

    J'aimerais donc dans un premier temps créer un type d'objet (du coup je ne sais pas si le plus approprié c'est une "struct", une "list", ou une "class") qui regrouperait les données suivantes:
    Code:
    char Name[16];
    short int GlobalFade;
    short int Red;
    short int Green;
    short int Blue;
    Je l'avais déjà mis en oeuvre sur un PIC24 (Microchip) en C dans une structure :

    Code:
    typedef struct
    {
    char Name[16];
    short int GlobalFade;
    short int Red;
    short int Green;
    short int Blue;
    }STRUCT_AmbiLight;
    Ensuite j'ai créé un tableau de 4 couleurs différentes :
    Code:
    STRUCT_AmbiLight myColor[4];
    Je faisais l'initialisation ainsi :
    Code:
    myColor[0].Name="BLUE";
    myColor[0].GlobalFade=0xFF; // 100%
    myColor[0].Red=0x00; // 0%
    myColor[0].Green=0x00; // 0%
    myColor[0].Blue=0xFF; // 100%
    
    myColor[1].Name="RED";
    myColor[1].GlobalFade=0xFF; // 100%
    myColor[1].Red=0xFF; // 100%
    myColor[1].Green=0x00; // 0%
    myColor[1].Blue=0x00; // 0%
    
    myColor[2].Name="GREEN";
    myColor[2].GlobalFade=0xFF; // 100%
    myColor[2].Red=0x00; // 0%
    myColor[2].Green=0xFF; // 100%
    myColor[2].Blue=0x00; // 0%
    
    myColor[3].Name="ORANGE";
    myColor[3].GlobalFade=0xFF; // 100%
    myColor[3].Red=0xFF; // 100%
    myColor[3].Green=0xFF; // 100%
    myColor[3].Blue=0x00; // 0%
    J'avais une fonction qui appelait les valeurs pointées, et qui était liée à 4 boutons-poussoirs.
    ça marchait bien (à vrai dire c'est basique).

    Mais comme vous l'aurez compris, le problème c'est que je ne peux pas créer des couleurs supplémentaires (par exemple en ajouter une 5ème correspondant au VIOLET) ou en supprimer en "live" sans avoir à l'ajouter dans le programme, recompiler et reflasher le µC.

    Du coup je voudrais déclarer mon type en fonction des paramètres Name, GlobalFade, Red Green et Blue.
    Sous Qt, en imaginant que j'utilise l'interface graphique, j'imagine qu'il serait possible de placer un bouton "Create" et un bouton "Delete", et créer ou supprimer des objets comme ceci :
    Code:
    Main::on_PushButton_Add_Event(MyColor *ColorToCreate)
    {
    create MyColor->ColorToCreate;
    
    ColorToCreate.Name="VIOLET";
    ColorToCreate.GlobalFade=0xFF;
    ColorToCreate.Red=0xFF;
    ColorToCreate.Green=0x0;
    ColorToCreate.Blue=0xFF;
    }
    Code:
    Main::on_PushButton_Del_Event(MyColor *ColorToDelete)
    {
    delete MyColor->ColorToDelete;
    }
    J'aurais une fonction qui permettrait d'appeler une couleur et la transmettre à la LED (c'est pas le tout de manipuler des variables, y a un moment faut s'en servir )
    Code:
    void set_LED_Color(MyColor *ColorToSet)
    {
    cout<<ColorToSet.Name;
    LED.Red = ColorToSet.Red * ColorToSet.GlobalFade;
    LED.Green = ColorToSet.Green * ColorToSet.GlobalFade;
    LED.Blue = ColorToSet.Blue * ColorToSet.GlobalFade;
    }
    Et ainsi pouvoir choisir la couleur en fonction d'un évènement :
    Code:
    Main::on_PushButton_RED_Event()
    {
    set_LED_Color(MyColor->red);
    }
    D'un point de vue technique, ça reste basique mais c'est surtout pour me faire un "programme type" qui me servira de base pour un programme plus complexe.

    C'est pour ce coté évolutif que j'aimerais partir sur des bases correctes au point de vue structuration.

    Encore merci

  9. #8
    lou_ibmix_xi

    Re : Débutant C++, Structure de base Qt 5.5

    Plusieurs remarques:

    Dans un premier temps je vais me contenter de Qt sur PC, une fois que je serai un peu plus à l'aise je verrai pour porter un petit programme sur ma carte de développement. ça a l'air faisable, mais il faut que je vois comment ça se configure et les limitations.
    A moins que ta carte de dev ne soit équipée d'un cortex A ou +, ou d'un arm 11 ou +, il y a peu de chance. Y a-t'il un linux graphique qui puisse tourner sur ta carte, ou android, si la réponse est non, il y a peu de chance que tu puisses utiliser Qt.

    J'aimerais donc dans un premier temps créer un type d'objet (du coup je ne sais pas si le plus approprié c'est une "struct", une "list", ou une "class") qui regrouperait les données suivantes
    "list" je ne connais pas ce type de container (du moins ce n'est pas un "type" de base, probablement un template ou une classe), mais il faut que ce soit claire qu'une classe (ou une structure) et un tableau (liste, dictionnaire...) sont conceptuellement très différents, une classe est une entité constituée d'éléments (à priori) hétéroclites (donc des données) et de méthode (donc des algorithmes) permettant de "conceptualiser" un aspect du problème. Une liste est juste une collection d'objets (à priori) du même type, donc juste des données et un moyen d'y accéder ne dépendant pas de la donnée mais du container. Structure ou classe, je dirai qu'en C++ c'est classes par défaut à moins qu'un type ne soit pas ammener à évoluer (pas de dérivation de classe), qu'il n'y a pas grand chose à faire de manière "atomique" durant la durée de vie de l'instance. Dernière remarque sur ces points, cherche un peu il existe une classe Qt encapsulant les notions de couleurs.

    Sinon en lisant ton pseudo-code je pense qu'il y a un gros problème sur la notion de classe / objet car une ligne comme:
    delete MyColor->ColorToDelete;
    ne veux absolument rien dire, tu as un type MyColor (qui se trouve être une classe), qui est instancié par "ColorToDelete" (pas tout à fait puisque c'est un pointeur), donc "delete ColorToDelete;" ou "MyColor::delete ColorToDelete;", je ne suis pas sûr de la validité de la dernière manière d'écrire, mais l'idée serait "la méthode delete de la classe MyColor appliquée à l'instance (pointée par) ColorToDelete".

    Enfin, pour le faire à la C++, il faudrait un constructeur de la classe MyColor qui prenne un ou plusieurs arguments pour "régler" les champs de l'objet (une classe est instanciée en un objet). Remarque au passage que ta fonction ne fonctionnera pas (ou bizarrement, ou par accident) car "Main:n_PushButton_Add_Event" travaille sur une copie de "ColorToCreate". A ce niveau là le C++ marche comme le C avec la "nouveauté" du passage par référence...
    Dernière modification par lou_ibmix_xi ; 19/01/2016 à 13h38.

  10. #9
    crokrodil

    Re : Débutant C++, Structure de base Qt 5.5

    Je reviens un peu tardivement, mais merci pour ces explications

    En ce qui concerne ma carte, c'est un ARM 7 M. Sans avoir tout compris, il semble être possible de convertir le code de Qt en QML pour le porter sur la carte. Il y a certainement des choses à implémenter dans le makefile pour ça mais je verrai plus tard.

    Sinon ma façon de programmer était plus pour mettre en évidence ce que je souhaite que pour faire un programme fonctionnel (sinon je ne serais pas là! )

    Du coup je pense que ce qui serait adapté à mon besoin serait une classe, étant donné que j'aurais des types différents, et des fonctions.

    Du coup si ce n'est pas possible de créer et détruire les objets de cette façon, les appeler dans d'autres fonctions, alors je pense que je passerai par des fichiers XML.

    Je sais que la classe color existe, mais je ne vais pas me limiter aux couleurs. Le projet final serait une console DMX-512 pour contrôler des jeux de lumières, mais avec des fonctions bien spécifiques...

  11. #10
    pm42

    Re : Débutant C++, Structure de base Qt 5.5

    Citation Envoyé par crokrodil Voir le message
    En ce qui concerne ma carte, c'est un ARM 7 M. Sans avoir tout compris, il semble être possible de convertir le code de Qt en QML pour le porter sur la carte.
    J'ai comme un doute.

  12. #11
    lou_ibmix_xi

    Re : Débutant C++, Structure de base Qt 5.5

    En ce qui concerne ma carte, c'est un ARM 7 M. Sans avoir tout compris, il semble être possible de convertir le code de Qt en QML pour le porter sur la carte. Il y a certainement des choses à implémenter dans le makefile pour ça mais je verrai plus tard.
    Je le répète une dernière fois après je laisse tomber: un Linux (graphique) ou androïd peuvent-ils tourner sur ta carte ? Oui -> tu pourras utiliser Qt. Non -> tu ne pourras vraisemblablement pas...
    Et le reste de la phrase montre clairement que tu n'as pas compris ce qu'était Qt, encore moins le QML. Qui va l'interpréter le QML sur ton micro, si tu n'as pas Qt ?

    Du coup si ce n'est pas possible de créer et détruire les objets de cette façon, les appeler dans d'autres fonctions, alors je pense que je passerai par des fichiers XML.
    c'est de moins en moins clair... je pense qu'il y a d'énormes confusions sur la poo...

  13. #12
    crokrodil

    Re : Débutant C++, Structure de base Qt 5.5

    µCLinux peut tourner mais n'est pas graphique, par contre le processeur est optimisé pour les GUI (il y a un périphérique qui gère le QVGA), et Qt tourne sur la carte, la preuve ici : https://www.youtube.com/watch?v=2ZfESR3YjaM, il faut "juste" configurer gcc correctement
    Dernière modification par crokrodil ; 28/01/2016 à 12h54.

Discussions similaires

  1. Réponses: 15
    Dernier message: 22/10/2013, 18h16
  2. Réponses: 30
    Dernier message: 01/03/2012, 18h27
  3. Réponses: 2
    Dernier message: 16/09/2010, 22h46
  4. Structure de molécule organique (débutant)
    Par invite1b403b6c dans le forum Chimie
    Réponses: 1
    Dernier message: 23/11/2007, 14h41
  5. une question de débutant... structure d'une molécule
    Par invite8fb21ee7 dans le forum Chimie
    Réponses: 6
    Dernier message: 02/09/2003, 21h43