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 :

QObject::QObject(const QObject&)' is private within this context


Sujet :

Qt

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 218
    Points : 55
    Points
    55
    Par défaut QObject::QObject(const QObject&)' is private within this context
    Bonjour,
    Je fais appel à vous aujourd'hui car ça fait plusieurs jours que je bloque sur un problème et pas moyen de m'en dépêtrer. J'ai créé une classe film, jusque là rien d'anormal. J'ai voulu qu'elle puisse réagir lorsqu'un signal est lancé. Je l'ai donc fait hériter de la classe QObject. Et là c'est le drame, depuis je reçoit l'erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    C:\Qt\5.3\mingw482_32\include\QtCore\qobject.h:465: erreur : 'QObject::QObject(const QObject&)' is private
         Q_DISABLE_COPY(QObject)
    H:\Filmothèque Qt\MyMediaLibraries\MyMediaLibraries\cpp.films\Movie.h:10: erreur : within this context
     class Movie: public QObject
    Pourtant à aucun moment je copie un objet de ma classe donc je n'arrive pas à comprendre mon message d'erreur...
    Voila mon code:
    Movie.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
    34
    35
    36
    37
    38
    #include "cpp.infos/TheMovieDB.h"
     
     
    class Movie: public QObject
    {
     
        Q_OBJECT
     
    public:
        Movie(QObject* parent=0);
     
        void getInfos();
     
        TheMovieDB *tmdb;
     
        int id;
        QString title;
        QDate releaseDate;
        QString genre;
        int note;
        bool alreadySeen;
        bool favourite;
        bool toBeSeen;
        QString synopsis;
        int duration;
        QString path;
        QString md5;
        QString backdropPath;
        QString backdropMD5;
        QString posterPath;
        QString posterMD5;
        QString collection;
     
    public slots:
        void updateDatas();
     
     
    };

    Movie.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
    48
    49
    50
    51
    52
    53
    54
    #include "Movie.h"
    #include "cpp.infos/TheMovieDB.h"
    #include "generalfunctions.h"
     
    Movie::Movie(QObject *parent):QObject(parent)
    {
        title = "";
        md5 = "";
        id = 0;
        path = "";
        releaseDate = QDate();
        genre = "";
        note = 0;
        alreadySeen = false;
        favourite = false;
        toBeSeen = false;
        synopsis = "";
        duration = 0;
        backdropPath = "";
        backdropMD5 = "";
        posterPath = "";
        posterMD5 = "";
        collection = "";
    }
     
    void Movie::getInfos()
    {
        QObject::connect( tmdb , SIGNAL( dataRetrieved() ) , this , SLOT( updateDatas() ));
        tmdb->search(title);
    }
     
     
    void Movie::updateDatas()
    {
        title = tmdb->t_infosList["title"].toString();
        md5 = "";
        id = tmdb->t_infosList["id"].toInt();
        path = "";
        releaseDate = tmdb->t_infosList["release_date"].toDate();
        note = tmdb->t_infosList["note"].toInt();
        synopsis = tmdb->t_infosList["overview"].toString();
        backdropPath = tmdb->t_infosList["backdrop"].toString();
        backdropMD5 = GeneralFunctions::hashMD5(tmdb->t_infosList["backdrop"].toString());
        posterPath = tmdb->t_infosList["poster"].toString();
        posterMD5 = GeneralFunctions::hashMD5(tmdb->t_infosList["poster"].toString());
        collection = tmdb->t_infosList["collection"].toString();
     
        QStringList genres = tmdb->t_infosList["genres"].toStringList();
        genre = genres[0];
        for(int i=0 ; i<genres.size() ; i++)
        {
            genre =genre + ", " + genres[i];
        }
    }
    Merci de votre aide.

    Cordialement

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonsoir,

    Rien dans le seul code que tu montres ne justifie ce message. Comment utilises-tu ta classe Movie ?

    À noter que toutes les lignes dans ton constructeur sont parfaitement inutiles : tu leur assignes à tous leur valeur par défaut, déjà fait implicitement au niveau de la liste d'initialisation (Cf. FAQ).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        QStringList genres = tmdb->t_infosList["genres"].toStringList();
        genre = genres[0];
        for(int i=0 ; i<genres.size() ; i++)
        {
            genre =genre + ", " + genres[i];
        }
    Si genres est potentiellement vide, la seconde ligne va poser problème le cas échéant. Tu peux utiliser la méthode QString QStringList::join(const QString & separator) const.

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 218
    Points : 55
    Points
    55
    Par défaut
    Ok merci je vais tout de suite aller modifier cette variable genre.
    Je vais réfléchir à cette histoire de variables initialisées.
    Pour le reste, mon code est trop long pour que je le poste ici. Cependant, quand j'enlève l'héritage de QObject par la classe Movie, alors le code compile. Ce qui me laisse supposer que le problème vient de là mais je ne sais absolument pas pourquoi.
    En fait dans les fichiers d'erreurs, le compilateur fait référence aux fichiers de ma classe bdd mais il n'indique pas la ligne fautive... Donc j'ai aucun moyen de savoir si ça vient bien de là ou pas.

  4. #4
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 218
    Points : 55
    Points
    55
    Par défaut
    ok j'ai trouvé les lignes fautives à force de tests. Donc ça se trouve bien dans ma classe bdd. C'est quand je déclare ma variable comme ça:
    La fonction complète:
    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
    Movie bdd::infoFilm(int id)
    {
        mmldb.setDatabaseName(pathDB);
        Movie movie;
     
        if(mmldb.open())
        {
            QSqlQuery query;
            query.prepare("SELECT title,md5,genre,note,alreadySeen,favourite,toBeSeen,synopsis,duration,path,\
                          pathWallPaper, releaseDate FROM Films WHERE IDFilm=:id");
                    query.bindValue(":id",id);
     
                    if (query.exec())
            {
                movie.title = query.value(0).toString();
                movie.md5=query.value(1).toString();
                movie.genre = query.value(2).toString();
                movie.note = query.value(3).toInt();
                movie.alreadySeen = query.value(4).toBool();
                movie.favourite = query.value(5).toBool();
                movie.toBeSeen = query.value(6).toBool();
                movie.synopsis = query.value(7).toString();
                movie.duration = query.value(8).toInt();
                movie.path = query.value(9).toString();
                movie.backdropPath = query.value(10).toString();
                movie.releaseDate = query.value(11).toDate();
                movie.id=id;
     
            }
            else
            {
                emit RequetteNonPossible(query.lastError().text());
            }
            mmldb.close();
        }
        else
        {
            emit BDDAbsente(mmldb.lastError().text());
        }
        return movie;
    }

  5. #5
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 218
    Points : 55
    Points
    55
    Par défaut
    ça marche parfaitement si la fonction renvoie un pointeur. Quelqu'un peut-il m'expliquer pourquoi est-ce que ça me met une erreur si je lui fait renvoyer une valeur plutôt qu'un pointeur?

  6. #6
    Responsable Qt & Livres


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


    Je ne puis que chaudement te recommander d'étudier plus en approfondi le C++ à ce sujet, par exemple dans http://cpp.developpez.com/faq/cpp/?p...tique-de-copie. Le principe, si ma mémoire est bonne : si tu fais une affectation en travaillant directement sur des objets, tu fais appel à l'opérateur d'affectation (operator=), qui doit être défini en même temps que le constructeur par copie. Par contre, ça devrait être évité par des références. À vérifier, cependant.
    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 !

Discussions similaires

  1. Réponses: 1
    Dernier message: 07/12/2012, 10h15
  2. [Débutant] Erreur de cast sur QOBJECT
    Par Somato dans le forum Débuter
    Réponses: 7
    Dernier message: 25/04/2008, 16h41
  3. probleme QObject::connect SLOT/SIGNAL
    Par sebatlante dans le forum Qt
    Réponses: 3
    Dernier message: 22/03/2008, 11h39
  4. QObject et constructeur de recopie
    Par ionnn dans le forum Qt
    Réponses: 12
    Dernier message: 07/01/2006, 11h50
  5. QObject::connect: No such slot
    Par guepe dans le forum Qt
    Réponses: 2
    Dernier message: 22/12/2005, 10h24

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