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 :

Passer une variable d'un QFileDialog d'un slot à une méthode dans un autre slot

  1. #1
    Membre régulier
    Homme Profil pro
    Inscrit en
    Avril 2009
    Messages
    182
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Avril 2009
    Messages : 182
    Points : 72
    Points
    72
    Par défaut Passer une variable d'un QFileDialog d'un slot à une méthode dans un autre slot
    Bonjour à tous !

    C’est une question bête, et même toute simple, mais je bloque… J’ai voulu me lancer, et je suis coincé, et je n’arrive pas à trouver d’exemple (c’est pas si facile à chercher).

    Je veux faire une chose bien classique : une fenêtre avec (entre autres) deux boutons : "choisir le fichier" et "lancer le traitement".
    Quand on clique sur le bouton "choisir le fichier", le slot envoie vers une méthode (choisirFichier()) qui ouvre un QFileDialog, on sélectionne le fichier.
    Et après, tadaam, je sais plus !
    Parce que le fichier, enfin son chemin renvoyé par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QFileDialog::getOpenFileName(this, "Ouvrir un fichier", QString(), "Fichier texte (*.txt)")
    je peux bien le mettre dans une QString, mais cette QString est dans la méthode, et je n’arrive pas à la passer ensuite en paramètre à une autre méthode, dans un autre connect !

    Alors bien sûr j’ai essayé de déclarer en variable de classe, d'utiliser cette variable ensuite dans la méthode, et il me dit un truc bizarre :
    "cannot convert 'QString' to 'QString*' in assignment"

    Je ne peux pas poster tout le code, ça serait monstrueux.
    Mais un bout :
    Fenetre.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 FENETRE_H
    #define FENETRE_H
     
    #include <QApplication>
    #include <QWidget>
    #include <QPushButton>
    #include <QMessageBox>
    #include <QString>
    #include <QFileDialog>
     
    class Fenetre : public QWidget
    {
        Q_OBJECT
     
    public:
        Fenetre();
     
    public slots:
        void ouvrirDialogueChoisir();
        void fonctionPrincipale(QString);
     
    private:
        QPushButton *choixFichier;
        QPushButton *go;
        QString *nomFichier;
    };
     
    #endif // FENETRE_H
    Fenetre.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 "Fenetre.h"
    #include <QTextStream>
     
    Fenetre::Fenetre() : QWidget()
    {
    // je mets pas toute la définition des boutons, bon, c'est du blabla
        QObject::connect(choixFichier, SIGNAL(clicked()), this, SLOT(ouvrirDialogueChoisir()));
        QObject::connect(go,SIGNAL(clicked()), this, SLOT(fonctionPrincipale(nomFichier)));
    }
    void Fenetre::ouvrirDialogueChoisir()
    {
        nomFichier = QFileDialog::getOpenFileName(this, "Ouvrir un fichier", QString(), "Fichier texte (*.txt)");
    }
     
    void Fenetre::fonctionPrincipale(QString nomFichierLu)
    {
        QTextStream cout(stdout, QIODevice::WriteOnly);
        cout << "OK !"; // c'est pour vérifier que ça marche une fois !
    }
    main.cpp (plus basique tu meurs)
    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
    #include <QApplication>
    #include <QTextCodec>
    #include "Fenetre.h"
     
     
    int main(int argc, char *argv[])
    {
        QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8"));
        QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8"));
        QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));
        QApplication app(argc, argv);
     
        Fenetre fenetre;
        fenetre.show();
     
        return app.exec();
    }
    Je ne sais pas si ça parle plus avec ça…

    En tout cas j’aimerais bien comprendre et réussir ! Merci d’avance pour votre aide !

  2. #2
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 884
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 884
    Points : 219 331
    Points
    219 331
    Billets dans le blog
    123
    Par défaut
    Bonjour,

    "cannot convert 'QString' to 'QString*' in assignment"
    L'erreur me semble claire. Vous voulez convertir un pointeur sur un QString en QString. Le compilateur vous dit : "non non, ce n'est pas possible !"

    Et cela se passe ici :
    nomFichier = QFileDialog::getOpenFileName(this, "Ouvrir un fichier", QString(), "Fichier TeX (*.tex)");
    Je crois. Il faut que nomFichier soit un QString et non un pointeur.

  3. #3
    Membre régulier
    Homme Profil pro
    Inscrit en
    Avril 2009
    Messages
    182
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Avril 2009
    Messages : 182
    Points : 72
    Points
    72
    Par défaut
    Merci ! En effet en enlevant l’astérisque devant nomFichier dans le Fenetre.h, je n’ai plus d’erreur de compilation.
    Cependant j’obtiens une sorte d’avertissement :
    Object::connect: No such slot Fenetre::fonctionPrincipale(nomFichier) in ../Fenetre.cpp:98
    (Dans mon exemple ça devient la ligne 8.)
    Je sélectionne un fichier, et quand je clique sur le bouton go ça devrait déclencher la fonction (donc afficher "OK" en console), et ce n’est pas le cas.

    Si besoin, je pourrai faire une version de code “allégée”, avec juste de quoi compléter le Fenetre.cpp pour que tout ça soit compilable !

  4. #4
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 884
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 884
    Points : 219 331
    Points
    219 331
    Billets dans le blog
    123
    Par défaut
    Le signal et le slot doivent avoir la même signature (soit, ils doivent avoir les même paramètres en entrée).
    Ce n'est pas le cas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QObject::connect(go,SIGNAL(clicked()), this, SLOT(fonctionPrincipale(nomFichier)));
    Il faudrait que votre fonction "fonctionPrincipale" ne prenne aucun paramètre.

  5. #5
    Membre régulier
    Homme Profil pro
    Inscrit en
    Avril 2009
    Messages
    182
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Avril 2009
    Messages : 182
    Points : 72
    Points
    72
    Par défaut
    D’accord, autrement dit, elle utilise directement et d’office le fichier choisi… Après tout c’est assez logique.
    Donc je viens d’écrire ça :
    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 "Fenetre.h"
    #include <QTextStream>
     
    Fenetre::Fenetre() : QWidget()
    {
    // je mets pas toute la définition des boutons, bon, c'est du blabla
        QObject::connect(choixFichier, SIGNAL(clicked()), this, SLOT(ouvrirDialogueChoisir()));
        QObject::connect(go,SIGNAL(clicked()), this, SLOT(fonctionPrincipale()));
    }
    void Fenetre::ouvrirDialogueChoisir()
    {
        nomFichier = QFileDialog::getOpenFileName(this, "Ouvrir un fichier", QString(), "Fichier texte (*.txt)");
    }
     
    void Fenetre::fonctionPrincipale()
    {
        QTextStream cout(stdout, QIODevice::WriteOnly);
        cout << nomFichier;
    }
    Et ça fonctionne ! Oui, évidemment, ça ne vous surprend pas, mais pour moi qui ai passé des heures à essayer de comprendre…

    Merci beaucoup !
    Juste parce que j’aimerais être sûr de bien comprendre : il faudrait que le signal ait aussi un paramètre, c’est ça ? Et que ce soit le même paramètre ? Et ça existe, ce genre de cas ?
    En tout cas je vais pouvoir cliquer sur "résolu" ! Merci !

  6. #6
    Responsable Qt & Livres


    Avatar de dourouc05
    Homme Profil pro
    Ingénieur de recherche
    Inscrit en
    Août 2008
    Messages
    26 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur de recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2008
    Messages : 26 656
    Points : 188 668
    Points
    188 668
    Par défaut
    Citation Envoyé par Celadon Voir le message
    il faudrait que le signal ait aussi un paramètre, c’est ça ? Et que ce soit le même paramètre ? Et ça existe, ce genre de cas ?
    Oui : un slot doit avoir au plus autant de paramètres, dans le même ordre, que le signal auquel il est connecté. http://qt.developpez.com/faq/?page=s...ace_signalslot.

    On l'utilise, par exemple, avec un QLineEdit : chaque fois que le texte est modifié, il envoie un signal avec, comme paramètre, le nouveau texte.

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

Discussions similaires

  1. Réponses: 13
    Dernier message: 07/11/2011, 15h41
  2. Réponses: 0
    Dernier message: 30/10/2008, 12h29
  3. [Smarty] Attribuer une class en fonction d'un résultat avec une variable
    Par kitten13 dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 25/09/2008, 20h03
  4. Réponses: 5
    Dernier message: 16/09/2008, 17h28
  5. recuperer une variable a partir de l'url d'une page aspx
    Par Taoufik109 dans le forum ASP.NET
    Réponses: 1
    Dernier message: 13/05/2008, 13h40

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