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 :

Erreur : "QIODevice device not open"


Sujet :

Qt

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    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
    Par défaut Erreur : "QIODevice device not open"
    Bonjour,

    Je rencontre sans doute un problème simple mais j'arrive pas à comprendre.
    J'ai le code ci-dessous qui me permet d'aller chercher des infos de films sur internet (en l’occurrence une image), et je souhaiterais l'enregistrer sur le disque.
    J'utilise un QNetworkAccessManager qui va chercher l'info sur internet. Une fois cela fait, j'inscris ces données dans un QFile.

    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
    void TheMovieDB::getPoster(const QString &pictureName, const QString &pictureUrl)
    {
        t_manager->disconnect(t_manager, SIGNAL(finished(QNetworkReply *)), this, SLOT(saveBackdrop(QNetworkReply *)));
        t_picturePath= "file:///"+QDir::currentPath()+"/poster/" + pictureName + ".jpg";
        t_infosList["poster"]=t_picturePath;
        QString url="http://image.tmdb.org/t/p/w1920"+pictureUrl;
        QObject::connect(t_manager, SIGNAL(finished(QNetworkReply *)), this, SLOT(savePoster(QNetworkReply *)));
        t_manager->get(QNetworkRequest(QUrl(url)));
    }
     
    void TheMovieDB::savePoster(QNetworkReply *reply)
    {
        qDebug()<<reply->readAll();
        QFile* file = new QFile;
        file->setFileName(t_picturePath);
        file->open(QIODevice::WriteOnly);
        file->write(reply->readAll());
        file->close();
        t_manager->disconnect(t_manager, SIGNAL(finished(QNetworkReply *)), this, SLOT(savePoster(QNetworkReply *)));
        emit dataRetrieved();
    }
    t_picturePath contient alors "file:///H:/Filmotheque Qt/MyMediaLibraries/Compilation/poster/Titanic.jpg". Le dossier poster existe donc normalement ça devrait marcher mais j'ai systématiquement ce message: "QIODevice::write: device not open", provenant de la ligne " file->write(reply->readAll());".
    Lorsque j'imprime reply->readAll() dans qDebug pour voir ce qu'il contient, j'ai ça:
    "????QIODevice::write: device not open" avec tous les points d'interrogation.

    Merci de votre aide.

    Cordialement

  2. #2
    Membre Expert
    Avatar de prgasp77
    Homme Profil pro
    Ingénieur en systèmes embarqués
    Inscrit en
    Juin 2004
    Messages
    1 306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 306
    Par défaut
    Salut. Attention avec readAll()
    QNetworkReply is a sequential-access QIODevice, which means that once data is read from the object, it no longer kept by the device. It is therefore the application's responsibility to keep this data if it needs to.
    Je te suggère de connecter quelque chose au signal error() :
    This signal is emitted when the reply detects an error in processing. The finished() signal will probably follow, indicating that the connection is over.
    Tu apprendras sûrement des choses.

  3. #3
    Membre Expert
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Par défaut
    Vu l’erreur je dirais plutôt que c’est file->open qui échoue. Donc déjà, tester sa valeur de retour (il doit renvoyer « true »).

    Ensuite, tu peux appeler la méthode « error() » sur ton objet QFile pour récupérer des informations supplémentaires sur le pourquoi de l’échec.

    Sinon c’est une histoire de style, mais plutôt que setFileName, utilises plutôt directement file->open(filename, filemode);

  4. #4
    Membre confirmé
    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
    Par défaut
    Effectivement, c'est bien file->open qui échoue. J'obtiens le code d'erreur 5 qui dit que le fichier ne peut pas être ouvert.
    Par contre j'ai aucune idée du pourquoi. J'aurais pensé que le chemin était mauvais mais j'ai déjà vérifié plusieurs fois. Je suis à cours d'idées...

  5. #5
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 494
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 494

  6. #6
    Membre confirmé
    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
    Par défaut
    ok mais je suis censé faire quoi maintenant? J'ai réglé toutes les autorisations du dossiers pour avoir tous les pouvoirs et ça marche toujours pas. Je sais pas quoi faire de plus.

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 29/04/2015, 09h13
  2. Réponses: 1
    Dernier message: 08/02/2013, 08h50
  3. [CVS] Problème de commit (Could not open lock file)
    Par 1tox dans le forum Eclipse Java
    Réponses: 4
    Dernier message: 19/10/2004, 11h22

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