IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Discussion :

Revue des principes de Qt et de son intégration dans mon programme

  1. #1
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 37
    Points : 24
    Points
    24
    Par défaut Revue des principes de Qt et de son intégration dans mon programme
    Bonjour,

    Je mets cela dans la partie débutant car je commence à bouillir après cette journée de programmation , je perds la boule

    J'aurais donc quelques questions sûrement très stupides auxquelles j'aurais voulu que l'on m'éclaire

    Tout d'abord :

    - L'utilisation de la bibliothèque Qt m'oblige t-il à refaire toute mes fonctions C++ déjà faite ? Je m'explique j'ai actuellement un programme en C++ avec plein de fonctions indépendantes que je voudrais lier par la suite à des boutons et autres widgets cependant cela m'oblige t-il à modifier mes fonctions en sachant que j'utilise beaucoup de librairies extérieures assez pénibles à comprendre ^^ je pense que non mais je voudrais une âme rassurante qui me confirme cela !!

    - Pourrait-on me rappeler le principe du slot et du signal j'arrête pas de regarder la doc mais je comprends plus rien ( c'est les neurone en feu ^^ ) , pourtant j'en ai déjà fait.

    Je m'arrête là avant que l'on tente de me tuer ^

    Merci de vôtre aide :p


    Bien cordialement
    D.S

  2. #2
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    17 437
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 17 437
    Points : 43 078
    Points
    43 078
    Par défaut qt réponses
    Bonsoir,

    Tu peux tout à fait garder tes fonctions C et les interfacer avec les objets Qt.

    Concernant les signaux/slots : les Widgets Qt émettent des signaux traités par les slots.

    Exemple:
    Un QPushButton ( bouton à presser comme le nom l'indique emet un signal clicked()-il y a d'autres signaux,j'ai pris celui-là par l'exemple )
    Ce signal est traité par le"slot"celui-ci traitant l’événement. C'est à toi de créer le "slot" lié au signal.

    Dans un objet C++, tu as les méthodes, les propriétés. Dans un objet Qt tu as en plus les signaux et les slots.

    Le slot contient le code ( la fonction ) à déclencher lors du signal.

    Dans le cas du QPushButton, tu lie ton ou tes slots à ton ou tes signaux.

    Si tu crée tes propres objets,tu peux créer tes propres signaux. (Objet from scratch ou surcharge d'objet existant )

    exemple de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    connect(bouton_popup2,SIGNAL(clicked()),this,SLOT(declenchement_selection()));
    La fonction connect lie la fonction declenchement_selection() au signal clicked de mon QPushButton nommé bouton_popup2

    Un signal prend ou non des paramètres ,il faut respecter à la lettre l'utilisation ou non des paramètres sinon ça fonctionne pas.
    Tu peux lier plusieurs signaux au même slot

    exemple de structure de classe :
    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
     
     
    class Mycode : public QMainWindow
    {
      Q_OBJECT
     
    public:
    QPushButton *bouton_popup;
    QPushButton *bouton_popup2;
     
    void fonction()
    {
    }
     
    public slots:
     
    declenchement_selection()
    {
    }
     
     
    }
    Q_OBJET est une macro indispensable ( il me semble) pour la gestion des signaux.

    Pour le reste,les tutoriaux sont très bien faits.

    Il est nécessaire de créer un makefile à partir de qmake. Si tu utilises des signaux /slot la commande make appelera un programme appelé MOC ( Meta Object Compiler ),ceci créera des fichiers .cpp dans mon cas appelé moc_mycode.cpp (mon objet s'appelant mycode) Tu peux l'editer pour voir comment ça fonctionne. Il est au cœur de la gestion des signaux/slots.

    Pour tes bibliothèques externe,il te faudra les intégrer dans le fichier qmake pour que le Makefile puisse les utiliser.

    Regardes du coté de a gestion des ressources dans Qt, à partir d'un fichier .qrc (fichier xml ) tu peux intégrer des fichiers en ressource.

    Si tu utilises qt designer, ton fichier qmake sera crée lorsde la création de ton projet.
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

  3. #3
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 37
    Points : 24
    Points
    24
    Par défaut
    Bonjour

    tout d'abord merci de ces quelques éclaircissement en effet je cherche a réaliser l'intégration totale de mon programme c++ en dans une interface QT et cela n'est pas particulièrement une mince affaire ^^
    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    Je vais partir sur un exemple concret que je vais devoir réaliser afin que je comprenne bien le principe 
    
    la création d'un bouton parcourir afin de parcourir des dossier qui une fois le chemin trouver met a jour une LineEdit avec le path du dossier
    
    Donc si j'ai bien compris voila comment je devrait procéder :
    
    * création d'un QPushButton 
    * Liaison du signal clicked a la fonction comme ci dessous 
    
    
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    123456
    QObject::connect(this, SIGNAL(clicked()), receveur ( Qpushbutton ? )  ,SLOT( on_pushButton_clicked());
    ]void Interface::on_pushButton_clicked()
    {
        QString selectedDCP = QFileDialog::getExistingDirectory(this);
    }
    Par contre comment du coup je peut lier deux widget en effet en effet je fois donc des lors que je clique sur le bouton parcourir implementer dans ma fonction la mise a jour du LineEdit cependant utilisant QT designer je ne comprend pas tout d'abord qu'elle est son nom et comment la manipuler .. De plus allons voir une autre fonction créer grace a QT designer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    123456
     
    void Interface::copy_clicked()
    {
        Interface* test= new Interface;
        test->copy("/home/testuser/Bureau/seb","/home/testuser/Bureau/sebcopie",true);
    }
    donc en faite des que je clique sur un bouton lancer la copie il m'active la fonction copy écrite comme ça cela fonctionne cependant quand j'essaye de rajouter des paramètres dans la fonction cela ne marche pas :s en sachant qu'elle est déclarer en private slot dans ma classe mais ne peut on pas fournir des paramètre aux slots du coup j'arrive pas a lier mes compétence en c++ avec cette bibliothéque :s
    EDIT :

    Je viens de trouver la solution quant a la manipulation d'un element de l'UI cependant j'ai encore quelque interrogation en effet j'essaye de crer un bouton copier qui appellera ma fonction copier en c++

    voici la fonction copier:
    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
    29
    30
    31
    32
    33
    34
    35
    36
    bool Interface::copy(const QString pathDCP, const QString pathdestination, const bool override)
    {
        QDir directory(pathDCP);
        bool error = false;
     
        if (!directory.exists()) { return false; }
     
        QStringList dirs = directory.entryList(QDir::AllDirs | QDir::Hidden |QDir::NoDotAndDotDot);
        QStringList files = directory.entryList(QDir::Files | QDir::Hidden);
        QList<QString>::iterator d,f;
     
        for (d = dirs.begin(); d != dirs.end(); ++d)
        {
            if ((*d) == "." || (*d) == "..") { continue; }
            if (!QFileInfo(directory.path() + "/" + (*d)).isDir()) { continue; }
     
            QDir temp(pathdestination + "/" + (*d));
            temp.mkpath(temp.path());
     
            if (!copy(directory.path() + "/" + (*d), pathdestination + "/" + (*d), override)) { error = true; }
        }
     
        for (f = files.begin(); f != files.end(); ++f)
        {
            QFile tempFile(directory.path() + "/" + (*f));
            if (QFileInfo(directory.path() + "/" + (*f)).isDir()){ continue; }
     
            QFile destFile(pathdestination + "/" + directory.relativeFilePath(tempFile.fileName()));
     
            if (destFile.exists() && override){destFile.remove();}
     
            if (!tempFile.copy(pathdestination + "/" + directory.relativeFilePath(tempFile.fileName()))){ error = true; }
        }
     
    return !error;
    }
    cette fonction fonctionne cependant je ne comprend pas comment l'utiliser en QT en effet elle attend deux paramètre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void Interface::copy_clicked()
    {
        Interface* test= new Interface;
        test->copy("/home/testuser/Bureau/seb","/home/testuser/Bureau/sebcopie",true);
    }
    coder comme cela ca fonctionne cependant ici je joue avec des liens deja entrée comment puis-je dire que je veux les liens extrait d'un QlineEdit ? puisque a ce que j'ai compris un slot ne renvoie pas de valeur je ne peut donc pas passez en paramètre de copy_clicked quoi que se soit j'ai quelque difficulté a comprendre cette notion.... :s

    j'ai tenter cela mais cela ne marche pas ..
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void Interface::copy_clicked()
    {
        Interface* test= new Interface;
        QString Source = ui->lineEdit->text();
        QString Dest = ui->lineEdit_2->text();
        test->copy(Source,Dest,true);
    }


    En vous remerciant
    Bien cordialement
    D.S

  4. #4
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 37
    Points : 24
    Points
    24
    Par défaut
    Donc tout comme une méthode un slot peut avoir des paramètres et retourner des résultat est ce bien cela ?

    Dans ce cas la si j'écris

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void Interface::copy_clicked(const QString pathsrc , const QString pathDest)
    {
        Interface* test= new Interface;
        test->copy("/home/testuser/Bureau/seb","/home/testuser/Bureau/sebcopie",true);
    }
    au niveau du prototype c'est totalement possible ?
    merci beaucoup de vôtre aide

  5. #5
    Membre expérimenté

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2009
    Messages
    1 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2009
    Messages : 1 009
    Points : 1 738
    Points
    1 738
    Par défaut
    chrtophe, signaux/slots ça n'a pas l'air très clair pour toi non plus, tes explications sont trop techniques pour comprendre le concept

    Un slot c'est une méthode comme une autre. Elle a juste un truc en plus pour Qt, c'est qu'on peut la "connecter" à un signal, c'est à dire l'abonner à un "cri" émis par n'importe quel QObject : "on m'a cliqué dessus ! on m'a modifié !...". Le signal s'utilise avec le mot clef "emit" :
    Tout le monde peut s'en foutre, émettre un signal ne fait rien. Par contre, des slots peuvent être connectés au signal, ce qui fait qu'ils seront exécutés par Qt si le signal est émis.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    QObject::connect(soldat, SIGNAL(jeSuisTouche()), medecin, SLOT(soignerSoldat());
    QObject::connect(soldat, SIGNAL(jeSuisTouche()), chef, SLOT(revoirStrategie());
    => Dès que "soldat" va émettre le signal "jeSuisTouche()", les méthodes "soignerSoldat()" du "medecin" et "revoirStrategie()" du "chef" vont se déclencher.

    Concrètement Qt a une boucle qui gère ça en continue : une map de toutes les connexions du programme, et dès qu'un signal est émis, Qt regarde dans la map si des méthodes y sont associées et les appelle.

    Un signal peut aussi transporter des informations (des arguments), qui peuvent être ignorés par le slot. En revanche si le slot a des arguments, on ne peut y lier que des signaux qui portent ces arguments.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    emit jeSuisTouche(auBras);
    Lectures indispensables :
    http://qt.developpez.com/doc/4.7/QObject/#connect
    http://qt.developpez.com/doc/4.7/signalsandslots/

  6. #6
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 37
    Points : 24
    Points
    24
    Par défaut
    J'ai vraiment un mal fou a mettre cette idée en place ou a l'appliquer sur ma fonction :

    Ce que j'ai compris

    J'ai bien comprisa présent ce qu’était un signal et un slot dans la théorie un signal est un événement auquel on accroche un slot soit une fonction
    cependant je ne comprend pas dans mon cas pourquoi du coup mon slot ne me renvoit rien en effet si le slot = méthode dans ce cas

    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
    29
    30
     
    void Interface::on_pushButton_clicked()
    {
        QString selectedDCP = QFileDialog::getExistingDirectory(this);
        QDir dcp(selectedDCP);
        QString CurrentDCP = dcp.path();
        ui->lineEdit->setText(CurrentDCP);
     
    }
     
    lineEdit prend donc en valeur le path du DCP 
     
    void Interface::on_pushButton_2_clicked()
    {
        QString selectedDestination = QFileDialog::getExistingDirectory(this);
        QDir dest(selectedDestination);
        QString CurrentDestination = dest.path();
        ui->lineEdit_2->setText(CurrentDestination);
     
    }
     
    le deuxieme lineEdit prend bien en valeur le path du repertoire de Dest 
     
    void Interface::copy_clicked()
    {
        Interface* test= new Interface;
        QString Source = ui->lineEdit->text();
        QString Dest = ui->lineEdit_2->text();
        test->copy(Source,Dest,true);
    }
    la fonction lineEdit->text() me renvoit bien la valeur du champ lineEdit alors pourquoi ma fonction copy ne peut pas les utiliser , c'est pour ca que je m'embrouille de partout avec cette histoire ^^

    merci encore pour toute vos explciations
    Bien cordialement
    D.S

  7. #7
    Membre expérimenté

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2009
    Messages
    1 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2009
    Messages : 1 009
    Points : 1 738
    Points
    1 738
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void Interface::copy_clicked()
    {
        copy(ui->lineEdit->text(), ui->lineEdit_2->text(), true);
    }
    Pourquoi tu créais, dynamiquement en plus, sans parent en plus (donc grosse fuite mémoire vu que tu ne supprimes pas) un objet Interface ? Alors que tu veux utiliser copy avec l'interface courante, celle qui est affichée ?

  8. #8
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 37
    Points : 24
    Points
    24
    Par défaut
    Sa fait depuis ce matin que je cherche ^^ je pense que une erreur de débutant qui ne maitrise encore pas toute les notion concernant les classe en c++

    cependant tu m'a enlever une grosse épine du pied

    Je te remercie d'une part d'avoir pris le temps et la patience de m'expliquer puis d'autre part de m'avoir éclairer sur cette erreur de c++ un peu bête

    Bien cordialement
    Dasvit Sébastien

  9. #9
    Membre expérimenté

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2009
    Messages
    1 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2009
    Messages : 1 009
    Points : 1 738
    Points
    1 738
    Par défaut
    Au-delà d'avoir résolu un problème, j'espère surtout que tu as compris. Tu sais qu'implicitement, la fonction est appelée sur "this". Le code précédent, en explicité :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void Interface::copy_clicked()
    {
        this->copy(this->ui->lineEdit->text(), this->ui->lineEdit_2->text(), true);
    }
    Donc ton objet Interface courant, c'est celui pointé par this.

  10. #10
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 37
    Points : 24
    Points
    24
    Par défaut
    En faite au début j'avais une classe qui s’appelait "Test" et la méthode copy était dans la classe Test

    Donc je pensais justement qu'en procédant ainsi c'est a dire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Interface* test= new Interface; 
    qui était au départ 
    Test* test=new Test;
    cela me permettait d'accéder au fonction de la classe test donc j'ai voulut faire la même pour la classe Interface mais j'en convient que ces stupide puisque comme tu le dit je suis dans l'instance courante

  11. #11
    Membre expérimenté

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2009
    Messages
    1 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2009
    Messages : 1 009
    Points : 1 738
    Points
    1 738
    Par défaut
    Dans tous les cas, un new doit être suivi d'un delete.

  12. #12
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 37
    Points : 24
    Points
    24
    Par défaut
    Je suis tout a fait d'accord la dessus et merci de le rappeler

    Merci encore
    Bien cordialement
    D.S

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Sons inaudibles dans mon prg
    Par jlb59 dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 26/03/2012, 13h06
  2. Réponses: 5
    Dernier message: 19/05/2011, 14h15
  3. [Debutant]jouer un son midi dans un programme Java
    Par Ghurdyl dans le forum Multimédia
    Réponses: 2
    Dernier message: 14/12/2006, 17h57
  4. Comment jouer des sons dans un programme ???
    Par aldur_disciple dans le forum MFC
    Réponses: 8
    Dernier message: 17/08/2005, 12h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo