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

Qt Discussion :

Appeler une fonction QFile dans une autre classe


Sujet :

Qt

  1. #1
    Membre à l'essai
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2015
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Mai 2015
    Messages : 20
    Points : 17
    Points
    17
    Par défaut Appeler une fonction QFile dans une autre classe
    Bonjour,

    Je débute depuis quelques temps en QT et je rencontre un problème pour appeler une fonction QFile dans une autre classe.
    Je ne sais pas dire si le probèle vient de ma méthode d'appel ou si cela vient des spécificités de QFile.

    Voici mon code :
    D'abord ma classe qui s'appelle DocumentCSV :

    DocumentCSV.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
     
    #ifndef DOCUMENTCSV_H
    #define DOCUMENTCSV_H
     
    #include <QObject>
    #include <QWidget>
    #include <QFile>
    #include <Qstring>
    #include <string>
     
     
    class DocumentCSV
    {
        Q_OBJECT
    public:
        DocumentCSV();
     
     public:
        //recup du nom du doc csv
        QString GetNomDuCSV();
        //ouvre un document QFile csv read only
        QFile OuvertureCsvLectureOnly(QFile MonCSV);
     
     
    };
     
    #endif // DOCUMENTCSV_H

    DocumentCSV.ccp :

    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
     
    #include "DocumentCSV.h"
    #include "Manager.h"
    #include <string>
    #include <QFile>
    #include <QTextStream>
    using namespace std;
     
    DocumentCSV::DocumentCSV()
    {
    }
     
    QString DocumentCSV::GetNomDuCSV()
    {
        //écrire la fonction pour obtenir la donnée
        QString m_nomCSV("projets.csv");
        return m_nomCSV;
        //ok
    }
     
    //ouvre un document QFile csv en lecture uniquement
    QFile DocumentCSV::OuvertureCsvLectureOnly(QFile *MonCSV)
    {
        if (MonCSV->open(QIODevice::ReadOnly))
        {
     
        }
        return MonCSV;
     
    }

    Et enfin, l'appel de mes 2 fonctions à partir de la class F_MenuPrincipal :
    f_menuprincipal.ccp
    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
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    #include "f_menuprincipal.h"
    #include "ui_f_menuprincipal.h"
    #include "F_Titres.h"
    #include "F_Livre.h"
    #include "DocumentCSV.h"
    #include <QDesktopServices>
    #include <QDate>
    #include <QFile>
    #include <QTextStream>
    #include <QMessageBox>
    #include <QDebug>
    #include <iostream>
    #include <QApplication>
    #include <QMouseEvent>
    #include <QString>
    #include <string>
    using namespace std;
    
    
    F_MenuPrincipal::F_MenuPrincipal(QWidget *parent) :
        QWidget(parent),
        ui(new Ui::F_MenuPrincipal)
      //initialisation de la fenetre
    {
        ui->setupUi(this);
    }
    
    void F_MenuPrincipal::OuverturePageLivreExistant(QString m_titre)
    {
        //import des données venant du csv
        DocumentCSV ClasseCSV;
    
        //QFile MonCSV = new QFile();
        QString Adresse;
    
        Adresse = ClasseCSV.GetNomDuCSV();
        Adresse="projets.csv";
        QFile *MonCSV = new QFile(Adresse);
        MonCSV = ClasseCSV.OuvertureCsvLectureOnly(*MonCSV); //ligne sur laquelle apparaissent les 2 erreurs
    
        //...
    
        F_Livre *fl = new F_Livre;
        fl->show();
        this->hide();
    }
    
    
    F_MenuPrincipal::~F_MenuPrincipal()
    {
        delete ui;
    }
    Voilà, après compilation j'ai ces 3 erreurs qui apparaissent:

    ..\AppliEnfants_V3\f_menuprincipal.cpp(359) : error C2248: 'QFile::QFile'ÿ: impossible d'acc‚der … private membre d‚clar‚(e) dans la classe 'QFile'
    c:\qt\5.10.1\msvc2013_64\include\qtcore\qfile.h(150)ÿ: voir la d‚claration de 'QFile::QFile'
    c:\qt\5.10.1\msvc2013_64\include\qtcore\qfile.h(57)ÿ: voir la d‚claration de 'QFile'
    ..\AppliEnfants_V3\f_menuprincipal.cpp(359) : error C2440: '='ÿ: impossible de convertir de 'QFile' en 'QFile *'
    Aucun op‚rateur de conversion d‚finie par l'utilisateur disponible qui puisse effectuer cette conversion, ou l'op‚rateur ne peut pas ˆtre appel‚



    Voilà, pour aller à l'encontre de la 2ème erreur, j'ai testé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    *MonCSV = ClasseCSV.OuvertureCsvLectureOnly(*MonCSV)
    qui ne me parait pas bon et qui génère une nouvelle erreur (QFile::QFile'ÿ: impossible d'acc‚der … private membre d‚clar‚(e) dans la classe 'QFile')

    Est ce qu'un spécialiste aurait une idée pour régler ce problème, un piste? ça serait super sympa parce que là, je rame.
    Le probème vient-il vraiment de mon appel ou bien des spécificités de QFile sachant que j'arrive sans problème à appeler la fonction précédente GetNomDuCSV qui est un QString...
    MERCI BEAUCOUP !

  2. #2
    Responsable Qt & Livres


    Avatar de dourouc05
    Homme Profil pro
    Ingénieur de recherche
    Inscrit en
    Août 2008
    Messages
    26 618
    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 618
    Points : 188 591
    Points
    188 591
    Par défaut


    N'y a-t-il pas une confusion entre QFile et QFile* ? Je regarde cette ligne-ci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MonCSV = ClasseCSV.OuvertureCsvLectureOnly(*MonCSV);
    Tu déréférences un pointeur vers QFile… pour donner en argument à une fonction qui prend justement un pointeur en argument (DocumentCSV::OuvertureCsvLectureOnly(QFile *MonCSV)). Dans ton cas, je pense qu'il serait plus approprié d'utiliser des références que des pointeurs (donc des QFile& que des QFile*).
    Vous souhaitez participer aux rubriques Qt (tutoriels, FAQ, traductions) ou HPC ? Contactez-moi par MP.

    Créer des applications graphiques en Python avec PyQt5
    Créer des applications avec Qt 5.

    Pas de question d'ordre technique par MP !

  3. #3
    Membre à l'essai
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2015
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Mai 2015
    Messages : 20
    Points : 17
    Points
    17
    Par défaut
    Merci pour ce retour rapide,
    effectivement, je ne maitrise pas encore complétement les pointeurs et les références.
    Je vais essayer avec les références...

    Bonjour @Dourouc05,

    Alors ce matin, j'ai essayé de retirer le pointeur et en fait si je le retire j'ai automatiquement une erreur

    ..\test1\mainwindow.cpp(21) : error C2440: 'initialisation'ÿ: impossible de convertir de 'QFile *' en 'QFile'
    Le constructeur pour class 'QFile' est d‚clar‚ 'explicit'
    alors que je n'ai déclaré aucun pointeur.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     QFile MonCSV = new QFile(SonNom);

    Je suis un peu perdue.Est ce que je ne suis pas obligée d'en mettre un pour déclaré un QFile?

    Je vais continuer mes recherches de mon côté.

    Merci beaucoup

    HelMar

    Et si je déclare en référence :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QFile MonCSV§ = new QFile(SonNom);
    J'ai exactement la même erreur...

    Alors tout simplement, j'ai modifié le déclaration de mon QFile :

    et l'erreur de pointage a disparu.

    En revanche, lorsque j'appelle ensuite ma fonction en passant mon QFile en argument, j'ai toujours cette erreur

    ..\test1\mainwindow.cpp(23) : error C2248: 'QFile::QFile'ÿ: impossible d'acc‚der … private membre d‚clar‚(e) dans la classe 'QFile'
    c:\qt\5.10.1\msvc2013_64\include\qtcore\qfile.h(150)ÿ: voir la d‚claration de 'QFile::QFile'
    c:\qt\5.10.1\msvc2013_64\include\qtcore\qfile.h(57)ÿ: voir la d‚claration de 'QFile'
    Sachant que la fonction que j'appelle est en public dans mon autre classe et que j'appelle sans problème une autre fonction de la même classe sans problème (avec pour seul argument un Qstring). Du oup, je ense que le problème vient de l'argument QFile.
    Quelqu'un aurait une petite idée, une piste??? Pourquoi QFile se déclare-t-il forcément en privé?
    MERCI

  4. #4
    Membre émérite
    Avatar de Daïmanu
    Homme Profil pro
    Développeur touche à tout
    Inscrit en
    Janvier 2011
    Messages
    696
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur touche à tout

    Informations forums :
    Inscription : Janvier 2011
    Messages : 696
    Points : 2 438
    Points
    2 438
    Par défaut
    Bonjour.

    Peux tu nous montrer le code mis à jour ?

    L'erreur indique que le constructeur de copie de QFile est privé, interdisant le passage de paramètre par copie à une fonction et surtout la copie de l'objet retourné par la fonction.

    Comme l'indique dourouc05, le mieux est de passer par des références. Donc ta fonction doit avoir cette signature : void OuvertureCsvLectureOnly(QFile& MonCSV);. Note que la fonction n'a plus à renvoyer de QFile, puisqu'en utilisant une référence tu travailles directement sur le fichier de la fonction appelante.
    Je fais appel aux esprits de Ritchie, Kernighan, Stroustrup et Alexandrescu
    Donnez moi la force, donnez moi le courage de coder proprement !

    « Ça marche pas » n'est PAS une réponse convenable, merci de détailler le souci en fournissant l’environnement, le code source, les commandes et les messages d'erreur.

    Ce club possède également un clavardage, on y trouve quelques perles entre deux sessions d'entraides.

  5. #5
    Membre à l'essai
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2015
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Mai 2015
    Messages : 20
    Points : 17
    Points
    17
    Par défaut
    Bonjour à tous,

    Un grand merci pour toutes vos réponses qui m'ont beaucoup aidées.
    Alors, grâce à vos retours et à d'autres recherches sur les forums (très anciennes discussions), j'ai pu constater qu'effectivement, je pouvais passer mon argument QFile en référence. En revanche, ma difficulté a été dans ma fonction d'ouverture, de retourner mon QFile modifié. Et là, mes connaissances et ma compréhension des pointeurs et des références ne sont pas encore assez poussées (ça viendra, j'y travaille!!).
    Du coup, voici la solution pour laquelle j'ai opté, j'ouvre mon QFile directement dans mon main (une ligne). Ensuite, j'appelle les fonctions de lecture et d'écriture qui elle ne doivent pas me retourner de QFile mais seulement des QString pour la lecture et un boolean pour l'écriture.

    Voici du coup mon code :

    documentscsv.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
     
    #ifndef DOCUMENTCSV_H
    #define DOCUMENTCSV_H
    #include <Qstring>
    #include <QFile>
     
    class documentcsv
    {
    public:
        documentcsv();
     
    };
     
    //recup du nom du doc csv
    QString GetNomDuCSV();
    bool GetRechercheNumero(QFile& MonCSV, QString Numero);
    #endif // DOCUMENTCSV_H
    documentscsv.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
    41
    42
    43
    44
    45
    46
    47
     
    #include "documentcsv.h"
    #include <QString>
    #include <QFile>
    #include <QMessageBox>
    #include <QTextStream>
     
    documentcsv::documentcsv()
    {
     
    }
     
    QString GetNomDuCSV()
    {
        //écrire la fonction pour obtenir la donnée
        QString m_nomCSV("projets.csv");
        return m_nomCSV;
    }
     
    //fonction de lecture - doit rechercher si un identifiant donné existe déjà
    bool GetRechercheNumero(QFile& MonCSV, QString Numero)
    {
        //lecture des données
        QTextStream datas(&MonCSV);
        QString ligne;
        QStringList listedemots;
        QString NumeroLivre;
        bool m_numeroexistant(false);
        while(!datas.atEnd())
        {
            ligne = datas.readLine();
            listedemots = ligne.split(";");
            NumeroLivre=listedemots.at(0);
     
            if (NumeroLivre != Numero)
            {
            }
            else
            {
                m_numeroexistant = true;
                break;
            }
        }
        //MonCSV->close();
        return m_numeroexistant;
        //ok
    }
    fonction de lancement du bouton de mainwindows.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
     
    int MainWindow::Lancement()
    {
        QString SonNom;
        SonNom=GetNomDuCSV();
        QMessageBox::critical(0, "ok", (SonNom));
        QFile MonCSV(SonNom);
     
     
    //ouverture du CSV (directe)
        if (MonCSV.open(QIODevice::ReadOnly))
        {
            bool ResultatIdentifiant(false);
            ResultatIdentifiant=GetRechercheNumero(MonCSV,"2018040101");
            if(ResultatIdentifiant=true)
            {
              QMessageBox::critical(0, "ok", ("il a trouvé l'identifiant"));
     
            }
            else
            {
               QMessageBox::critical(0, "ok", ("il n'a pas trouvé d'identifiant"));
            };
        }
        else
        {
            QMessageBox::critical(0, "ok", ("Le document CSV est introuvable"));
        }
        return 0;
     
    //ajouter la fermeture du CSV
    }
    Voilà, les références que vous m'avez conseillé m'ont permis de passer mon CSV en argument et le fait de l'ouvrir directement m'évite les pointeurs de pointeurs, ce qui est trop compliquépour moi pour le moment

    Un grand merci !

Discussions similaires

  1. Réponses: 3
    Dernier message: 02/07/2013, 20h49
  2. appeler une fonction php dans une fonction javaScript
    Par geeksDeve dans le forum Langage
    Réponses: 3
    Dernier message: 17/04/2012, 15h30
  3. Réponses: 8
    Dernier message: 05/04/2011, 08h06
  4. Réponses: 10
    Dernier message: 14/03/2009, 13h36
  5. Réponses: 1
    Dernier message: 25/10/2007, 21h25

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