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

  1. #1
    Membre à l'essai
    Appeler le slot d'une autre classe
    Salut, je travaille sur un logiciel qui lit un fichier pour le modifier et le sauvegarder. J'essaie donc de connecter le signal clicked() d'un bouton de ma classe fenetre au slot de ma classe fichier, ce slot est selectFile(), il permet simplement de choisir le fichier avec l'explorateur pour stocker le chemin dans un QString.
    Le programme compile bien mais affiche QObject::connect: No such slot QFile::selectFile() lors de l'exécution et le bouton ne répond pas, il ne se passe rien.

    J'ai choisit des noms de classe nuls par contre, comme Mywin pour la fenetre, pas la peine de me le préciser, j'avais juste pas envie de tout changer et de m'embrouiller davantage. Et aussi ma classe fichier (Myfile) hérite de QWidget car elle doit pouvoir utiliser getOpenFileName(), cette méthode est utilisée par le slot selectFile() justement.

    Mywin.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
    29
    30
    31
    32
     
    #ifndef DEF_MAFENETRE
    #define DEF_MAFENETRE
     
    #include <QApplication>
    #include <QWidget>
    #include <QPushButton>
    #include <QMessageBox>
    #include <QString>
    #include <QTextStream>
    #include <QComboBox>
    #include <QFile>
    #include "myfile.h"
     
    class Mywin : public QWidget
    {
        Q_OBJECT
     
        public:
        Mywin();
        int getIndex();
     
        private:
        QPushButton *m_button1;
        QPushButton *m_button2;
        QPushButton *m_button3;
        QComboBox *m_scrollList ;
        QFile *m_file;
     
    };
     
    #endif



    Mywin.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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
     
    #include "mywin.h"
    #include "myfile.h"
     
     
    Mywin::Mywin() : QWidget()
    {
        setFixedSize(500, 250);
        m_button1 = new QPushButton("choix 1", this);
        m_button2 = new QPushButton("choix 2", this);
        m_button3 = new QPushButton("choix 3", this);
        m_button1->move(60,40);
        m_button2->move(60,80);
        m_button3->move(160,180);
     
        m_scrollList = new QComboBox();
     
        QString chaine1 = "texte1";
        QString chaine2 = "texte2";
        QString chaine3 = "texte3";
        QStringList strlist = (QStringList() << chaine1 << chaine2 << chaine3) ;
     
        m_scrollList->addItems(strlist);
        m_scrollList->setCurrentIndex(2);
     
     
        m_file = new QFile();
        QObject::connect(m_button1, SIGNAL(clicked()), qApp, SLOT(quit())) ;
        QObject::connect(m_button2, SIGNAL(clicked()), m_file, SLOT(selectFile())) ;
        QObject::connect(m_button3, SIGNAL(clicked()), m_file, SLOT(saveFile())) ;
     
    }
     
     
    int Mywin::getIndex(){
     
        int index = m_scrollList->currentIndex();
        return index;
     
    }



    Myfile.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
    29
    30
    31
    32
    33
    #ifndef MYFILE_H
    #define MYFILE_H
     
    #include <QApplication>
    #include <QWidget>
    #include <QString>
    #include <QFileDialog>
    #include <QFile>
    #include <QTextStream>
    #include <QDataStream>
    #include "mywin.h"
     
    class Myfile : public QWidget
    {
     
        Q_OBJECT
     
    public:
        Myfile();
     
    public slots:
        void selectFile();
        void saveFile();
     
     
    private:
        QFile *file;
        QTextStream m_stream;
        QDataStream m_datastream;
     
    };
     
    #endif // MYFILE_H



    Myfile.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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    #include "myfile.h"
     
    Myfile::Myfile() {
     
    }
     
     
    void Myfile::selectFile(){
     
        QString chemin = QFileDialog::getOpenFileName(this, "Ouvrir un fichier", QString(), "*.txt");
        file = new QFile(chemin);
        file->open(QIODevice::ReadWrite);
     
    }
     
     
    void Myfile::saveFile(){
     
        QString offset = "0x23";
        bool ok;
        uint offsetdec = offset.toUInt(&ok, 16);
     
        QTextStream m_stream(file);
     
        m_stream.seek(offsetdec);
     
        QDataStream m_datastream(file);
     
        Mywin wnd;
        int indexListe = wnd.getIndex();
        quint16 number = indexListe;
        m_datastream << number;
     
        file->close();
    }

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

    Bonjour,

    En effet, il ne trouve pas de fonction selectFile() dans la classe QFile.
    Votre classe, ce n'est pas QFile mais MyFile. Vous instanciez la mauvaise classe (semble t-il).
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  3. #3
    Membre à l'essai
    Merci pour votre réponse, en fait il y a un problème car mes classes sont interdépendantes, l'une inclut l'autre et inversement. Pour inclure la classe myfile dans mywin le compilateur essaye d'inclure mywin dans myfile, et pour ça il doit d'abord inclure myfile dans mywin, et ainsi de suite. Il ne peut pas compiler.
    Je pense que j'ai un problème de relation entre les classes, est-ce qu'il faut regrouper les 2 classes en une seule quand il y a une relation de dépendance trop forte entre les deux ?

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

    Normalement, cela ne devrait pas poser plus de problème que ça (sauf un problème de conception), mais en tout cas le compilateur pourra compiler.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

###raw>template_hook.ano_emploi###