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 :

Liste des fichiers à télécharger


Sujet :

Qt

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    264
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 264
    Par défaut Liste des fichiers à télécharger
    Bonjour

    Je suis entrain de voir pour faire une liste de fichier à télécharger pour mon updater.
    Donc je fait une requête post et dedans je fais une comparaison avec le md5 pour savoir les fichiers à télécharger ou non.

    Mais la je suis fasse à un problème de logique surtout...

    Je récupère la balise xml :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    <fichier name="QtCore4.dll" dir="" md5="<?php echo md5_file('QtCore4.dll'); ?>" />
    <fichier name="test.dll" dir="test/" md5="<?php echo md5_file('test.dll'); ?>" />
    Donc déjà il faudrait que je fasse le code de tel façon a ce que j'ai le chemin, et le nom du fichier et si possible le md5 pour faire une comparaison quand on déplace le fichier du dossier temporaire au dossier d'installation du programme.

    Donc après je fais une liste sous cette forme :
    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
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
     
    QList<QString> listElemAjout;
     
        QNetworkReply *reply = qobject_cast<QNetworkReply*>(sender());
        QXmlStreamReader reader(reply->readAll());
        reader.readNext();
     
        while(!reader.atEnd())
        {
            reader.readNext();
     
            if(reader.error())
            {
                qDebug() << reader.error();
                return;
            }
            if(reader.isStartElement())
            {
                if (reader.name() == "liste_fichiers")
                {
                    while(!(reader.isEndElement() && reader.name().compare("liste_fichiers")==0))
                    {
                        reader.readNext();
     
                        if(reader.isStartElement() && reader.name() == "fichier")
                        {
                            QString attrNAME = reader.attributes().value("name").toString();
                            QString attrDIR = reader.attributes().value("dir").toString();
                            QString attrMD5 = reader.attributes().value("md5").toString().trimmed();
                            QString strNameContrib = reader.readElementText();
     
                            QString cheminDuRepertoire = QCoreApplication::applicationDirPath();
                            QDir repertoire(cheminDuRepertoire);
                            repertoire.setFilter(QDir::NoDotAndDotDot | QDir::Files);
     
                            if(QFile::exists(attrDIR+attrNAME) == false)
                            {
                                listElemAjout.push_back(attrNAME);
                            }
     
                            foreach(QFileInfo fileInfo, repertoire.entryInfoList())
                            {
                                QFile file(fileInfo.absoluteFilePath());
                                file.open(QIODevice::ReadOnly);
                                QByteArray data = file.readAll();
                                QCryptographicHash md5(QCryptographicHash::Md5);
                                md5.addData(data);
                                QByteArray hah = md5.result();
     
                                if(fileInfo.fileName() == attrNAME)
                                {
                                    if(attrNAME.compare(fileInfo.fileName(), Qt::CaseInsensitive) == 0)
                                    {
                                        listElemAjout.push_back(attrNAME);
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
        // Liste de tout les noms de fichiers à télécharger
        for (int i = 0; i < listElemAjout.size(); i++)
        {
            qDebug() << listElemAjout[i];
        }
     
        reply->deleteLater();
        telechargement_fichier();
    }
     
    void FenUpdater::telechargement_fichier()
    {
        // Boucle pour télécharger tout les fichiers de la liste !
        QNetworkRequest url_requete(QUrl("fichier"));
        QNetworkAccessManager *manager = new QNetworkAccessManager;
        QNetworkReply *reply = manager->get(url_requete);
        connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(messageErreur(QNetworkReply::NetworkError)));
        connect(reply, SIGNAL(downloadProgress(qint64, qint64)), this, SLOT(infos_telechargement_fichier(qint64, qint64)));
        connect(reply, SIGNAL(finished()), this, SLOT(enregistrer()));
    }
    Et ensuite il faudrait que je mets en paramètre la liste pour le slot telechargement_fichier.
    Et la arrive un nouveau problème... Comment tous les télécharger et ensuite aller au slot enregistrer pour les enregistrer dans le fichier temporaire ?
    Il faudrait pas mieux que je fasse la copie dans ce même slot telechargement_fichier() ?

    Merci !

  2. #2
    Responsable Qt & Livres


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

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2008
    Messages : 26 754
    Par défaut
    Voici déjà le PHP que j'utilise pour produire ce fichier XML :

    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
    55
    56
    57
    58
    59
    <?php
     
    /*
    **    Récupère dans un tableau l'ensemble des fichiers
    **    du dossier updates, leurs hashes MD5, SHA1,
    **    et la date de dernière modification (en brut)
    */
     
    $dir = opendir('./'); 
    $i = 0;
    $list = array();
     
    while($file = readdir($dir))
    { 
        if ($file != 'index.php' && $file != '.' && $file != '..')
        {
            $list[$i] = array (
                            'filename'    => $file,
                            'md5'        =>  md5_file ($file),
                            'sha1'        => sha1_file ($file),
                            'raw_date'    => filemtime ($file)
                              ); 
            ++$i;
        }
    } 
     
    closedir($dir); 
     
    /*
    **    Redirige le tableau vers un XML, en convertissant la date
    */
     
    // Utilisation de l'extension XmlWriter, disponible dès PHP 5.1.2
     
    $result = new XmlWriter ();
    $result->openMemory();
     
    $result->startDocument ('1.0', 'utf-8');    /*    <?xml version="1.0" encoding="utf-8"?>  */
    $result->startElement ('files');            /*    <files>      */
     
    foreach ($list as $file)
    {
        $result->startElement ('file');         /*    <file>       */
    		$result->writeElement ('filename', $file['filename']);							/*    <filename />       */
    		$result->writeElement ('md5', $file['md5']);									/*    <md5 />            */
    		$result->writeElement ('sha1', $file['sha1']);									/*    <sha1 />           */
    		$result->writeElement (  'date',  date ('d/m/Y/H/i/s', $file['raw_date'])  );	/*    <date />           */
        $result->endElement();                  /*    </file>      */
    }
     
    $result->endElement();                      /*    </files>     */
    $result->endDocument();                     /*                 */
     
    /*
    **    Affichage du fichier XML brut
    */
     
    echo $result->outputMemory();
    ?>
    Vois si ça t'aide, je continue ma réponse dans quelques temps.
    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 confirmé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    264
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 264
    Par défaut
    Oui j'avais vu dans ton tuto mais comme j'ai pas assez de compétence j'ai fais plus simple ^^

    Pour l'instant ça fonctionne j'arrive à télécharger le fichier xml, le traiter mais je bloque à ce niveau... Comment envoyer ma liste de fichier à télécharger dans le slot qui va faire en sorte de télécharger tout les fichiers et de les placer dans le dossier temporaire.

    Ce qui ne fonctionne pas actuellement c'est juste d'envoyer une liste des fichiers dans ce slot.

    Après si tu veux je peux toujours t'envoyer les sources de ce que j'ai déjà fait pour que tu vois un peu mais je pense qu'au final c'est la même chose sauf que le miens et beaucoup plus simplifié et moins optimisé, donc comme tu veux

    PS : comment tu sais avec ton code si ton fichier dois s'installer dans le dossier racine ou un sous dossier ?

    Merci

  4. #4
    Responsable Qt & Livres


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

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2008
    Messages : 26 754
    Par défaut
    Comment as-tu traité le fichier ? Qu'est-ce que tu as comme structure ?

    Avec cette solution, j'arrive à une liste de fichiers à télécharger avec MD5, SHA1 et timestamp, envoyée depuis la partie XML vers la partie réseau (à coups d'emit et de slots). Une fois dans la partie réseau, il suffit d'itérer la liste et, pour chaque item, tu vérifies si tu dois mettre à jour le fichier ou non. Si oui, tu lances un signal avec l'URL du fichier à télécharger et son emplacement. Un slot le récupère, lance le téléchargement et connecte le signal de fin de téléchargement au slot d'écriture du fichier.

    Tu aurais donc un QVector de fileToDownload (ou une autre structure définie par toi) que tu passes en paramètre lors de l'émission du signal :

    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
    QVector<fileToDownload> fichiers; 
    /* remplissage du vecteur */
    emit iHaveMyVector(vector);
     
    slot iHaveMyVector(QVector<fileToDownload> vector)
    {
    foreach(vector, item)
    {
    emit downloadThisYouSlave(item);
    }
    }
     
    slot downloadThisYouSlave(fileToDownload file)
    {
    QNetworkReply this->reply = manager->get(QNetworkRequest(QUrl(file.url()))); 
    connect(request, SIGNAL(finished), this, SLOT(writeThisYouSlave));
    }
     
    slot writeThisYouSlave()
    {
    this->reply est un QIODevice, fais-en ce que tu en veux. 
    }
    C'est du pseudo-code à base de C++, ça ne compilera pas, mais ça donne l'idée générale. Même avec une syntaxe correcte, ça ne fonctionnera pas, tu ne stockes qu'une réponse à la fois dans ton objet. Sans trop changer de choses, tu peux modifier le code pour ne lancer le téléchargement suivant que quand le fichier est écrit. Ou bien, lancer à chaque fois, un thread pour le téléchargement d'un ficheir. OU bien simploement un autre objet qui se charge de prendre l'URL à télécharger et qui le télécharge et le met lui-même.

    Pour savoir où le stocker, tu reprends l'URL, tu enlèves l'URI du mirroir et te voilà avec le nom de ton fichier. Pour faire du multirépertoire, utilise un caractère genre _ pour signifier un nouveau répertoire.

    Edit : ah, la belle heure !
    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 !

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    264
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 264
    Par défaut
    Ah oui ok moi je compare le md5 du fichier dans le fichier xml avec le md5 du fichier de l'utilisateur si différent je le télécharge sinon je fais rien.

    Mais c'est ça qui me bloque parce que si je fais une liste je vais devoir télécharger un par un,

    Donc il faut que je crée une liste au fur et à mesure une fois le traitement finit je lance le slot de téléchargement avec la liste en paramètre et ensuite dans le slot téléchargement je fais une boucle pour télécharger tout les fichiers :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    QNetworkRequest url_requete(QUrl("URL_DU_FICHIER_DANS_LA_LISTE"));
        QNetworkAccessManager *manager = new QNetworkAccessManager;
        QNetworkReply *reply = manager->get(url_requete);
        connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(messageErreur(QNetworkReply::NetworkError)));
        connect(reply, SIGNAL(downloadProgress(qint64, qint64)), this, SLOT(infos_telechargement_fichier(qint64, qint64)));
        connect(reply, SIGNAL(finished()), this, SLOT(enregistrer()));
    Donc il serait mieux de mettre la fonction pour réécrire le fichier télécharger directement avec le code de téléchargement dans la boucle qui permet de télécharger chaque fichier et de l'enregistrer non ?

  6. #6
    Responsable Qt & Livres


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

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2008
    Messages : 26 754
    Par défaut
    Citation Envoyé par austin.fla Voir le message
    Donc il faut que je crée une liste au fur et à mesure une fois le traitement finit je lance le slot de téléchargement avec la liste en paramètre et ensuite dans le slot téléchargement je fais une boucle pour télécharger tout les fichiers
    C'est une des solutions possibles, tu peux créer la tienne si tu veux.

    Citation Envoyé par austin.fla Voir le message
    Donc il serait mieux de mettre la fonction pour réécrire le fichier télécharger directement avec le code de téléchargement dans la boucle qui permet de télécharger chaque fichier et de l'enregistrer non ?
    Sauf que tu n'as pas directement le fichier téléchargé dès que tu en as demandé le téléchargement. De plus, ces fonctions sont asynchrones : tu fais la demande, rien n'est disponible mais la portion de code continue à s'exécuter. Il faut impérativement séparer cette partie, n'écrire le fichier que dans un slot exécuté uniquement quand le signal readyRead ou finished est arrivé. Sinon, tu écriras des bribes de fichier.
    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 !

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    264
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 264
    Par défaut
    Je n'arrive pas à comprendre comment tu veux faire

  8. #8
    Responsable Qt & Livres


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

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2008
    Messages : 26 754
    Par défaut
    Quand tu as ta liste d'objets à télécharger, tu ne peux pas lancer tous les téléchargements en même temps à un endroit, il faut séparer à cet endroit (ou alors, il faut chipoter pour avoir plusieurs QNetworkReply dans l'objet : un compteur et un tableau de Replies, par exemple). Dans ce cas, une solution serait d'instancier, pour chaque élément à télécharger, un objet qui se charge de télécharger et d'installer le fichier.
    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 !

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    264
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 264
    Par défaut
    Ok donc dans mon cas c'est bon j'ai bien séparé en 3 partis : Traitement XML, Téléchargement, enregistrement du fichier dans le dossier temp.

    Mais je n'arrive pas à trouver d'exemple ou autre pour télécharger plusieurs fichiers à la suite ou autre d'une liste je bloque dessus et sur internet je trouve rien...

  10. #10
    Responsable Qt & Livres


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

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2008
    Messages : 26 754
    Par défaut
    C'est très exactement la même chose : tu transmets les mêmes paramètres à ton téléchargeur, sauf que tu les prends de ta liste. Poste-ton code ici, une réponse pleine de caractères bizarres devrait t'aider un peu plus. Pas tout, s'il-te-plaît, juste la partie utile : comment tu lances ton téléchargement.
    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 !

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    264
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 264
    Par défaut
    Voilà le code de update.cpp, j'ai essayé de le diminuer au maximum...

    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
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
     
    void FenUpdater::traitement_xml()
    {
        QList<QString> listElemAjout;
     
        QNetworkReply *reply = qobject_cast<QNetworkReply*>(sender());
        QXmlStreamReader reader(reply->readAll());
        reader.readNext();
     
        while(!reader.atEnd())
        {
            reader.readNext();
     
            if(reader.error())
            {
                qDebug() << reader.error();
                return;
            }
            if(reader.isStartElement())
            {
                if (reader.name() == "liste_fichiers")
                {
                    while(!(reader.isEndElement() && reader.name().compare("liste_fichiers")==0))
                    {
                        reader.readNext();
     
                        if(reader.isStartElement() && reader.name() == "fichier")
                        {
                            QString attrNAME = reader.attributes().value("name").toString();
                            QString attrDIR = reader.attributes().value("dir").toString();
                            QString attrMD5 = reader.attributes().value("md5").toString().trimmed();
                            QString strNameContrib = reader.readElementText();
     
                            QString cheminDuRepertoire = QCoreApplication::applicationDirPath();
                            QDir repertoire(cheminDuRepertoire);
                            repertoire.setFilter(QDir::NoDotAndDotDot | QDir::Files);
     
                            if(QFile::exists(attrDIR+attrNAME) == false)
                            {
                                listElemAjout.push_back(attrNAME);
                            }
     
                            foreach(QFileInfo fileInfo, repertoire.entryInfoList())
                            {
                                QFile file(fileInfo.absoluteFilePath());
                                file.open(QIODevice::ReadOnly);
                                QByteArray data = file.readAll();
                                QCryptographicHash md5(QCryptographicHash::Md5);
                                md5.addData(data);
                                QByteArray hah = md5.result();
     
                                if(fileInfo.fileName() == attrNAME)
                                {
                                    if(attrNAME.compare(fileInfo.fileName(), Qt::CaseInsensitive) == 0)
                                    {
                                        listElemAjout.push_back(attrNAME);
                                    }
                                }
                            }
                        }
                    }
                }
     
                if (reader.name() == "liste_supprimer")
                {
                    qDebug() << reader.name();
     
                    while(!(reader.isEndElement() && reader.name().compare("liste_supprimer")==0))
                    {
                        reader.readNext();
     
                        if(reader.isStartElement() && reader.name() == "fichier")
                        {
                            QString attrNAME = reader.attributes().value("name").toString();
                            QString attrMD5 = reader.attributes().value("md5").toString();
                            QString strNameContrib = reader.readElementText();
                            QList<QString> listElemSupp;
     
                            listElemSupp.push_back(attrNAME);
                        }
     
                    }
                }
            }
        }
        for (int i = 0; i < listElemAjout.size(); i++)
        {
            qDebug() << listElemAjout[i];
        }
     
        reply->deleteLater();
        telechargement_fichier();
    }
     
    void FenUpdater::telechargement_fichier()
    {
        // attrNAME dois se trouver dans la liste c'est le nom du fichier
        QNetworkRequest url_requete(QUrl(NOMSERVEUR+"/"+attrNAME));
        QNetworkAccessManager *manager = new QNetworkAccessManager;
        QNetworkReply *reply = manager->get(url_requete);
        connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(messageErreur(QNetworkReply::NetworkError)));
        connect(reply, SIGNAL(finished()), this, SLOT(enregistrer()));
    }
     
    void FenUpdater::enregistrer()
    {
        // On enregistre le fichier avec le nom qui se trouve dans la liste : attrNAME !
        QFile fichier_temp(QDir::tempPath()+"/"+QString(NOMEXE)+"/"+QString("attrNAME"));
        fichier_temp.open(QIODevice::WriteOnly);
        fichier_temp.write(reply->readAll());
        fichier_temp.close();
        fichier_temp.deleteLater();
    }
    Et le fichier update.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 UPDATER_H
    #define UPDATER_H
     
    #include "ui_updater.h"
    #include "constante.h"
     
    namespace Ui
    {
        class FenUpdater;
    }
     
    class FenUpdater : public QMainWindow, private Ui::FenUpdater
    {
        Q_OBJECT
     
        public:
            FenUpdater(QMainWindow *parent = 0);
            qint64 bytesReceivedLast;
            QNetworkAccessManager manager;
            QNetworkRequest url_requete;
            QNetworkReply *reply;
            QList<QString> ListeLignes;
     
        private slots:
            void traitement_xml();
            void telechargement_fichier();
            void enregistrer();
    };
     
     
    #endif // UPDATER_H
    Merci !

  12. #12
    Responsable Qt & Livres


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

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2008
    Messages : 26 754
    Par défaut
    Tu n'as pas encore assez découplé : là, tu as un seul et unique QNetworkReply dans ton objet, donc un seul téléchargement possible.

    Code cpp : 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
    class downloader: public QObject
    {
    Q_OBJECT
    public: 
    downloader(QUrl url, QObject * parent);
    public slots: 
    void startDownload();
    signals: 
    void downloaded();
     
    private: 
    QNetworkManager * manager;
    QNetworkReply * reply; 
    public: 
    QNetworkReply reply();
    }

    Ce n'est que le header, je te laisse l'implémentaion .

    Niveau appel, tu devrais faire qqch du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    foreach(item, listElemAjout)
    {
    downloader * down = new downloader(item, this);
    ++this->fileDownloading;
    connect(down, SIGNAL(downloaded), this, SLOT(oneHasDownloaded));
    }
    this->canFinish = true;
    Ce qui permet de ne détruire les téléchargeurs que quand ton objet actuel est détruit (très pratique, cela t'évite de les voir disparaître n'importe quand). Je n'ai pas revérifié l'emploi précis de foreach sur ton conteneur, cela peut être à adapter, mais c'est l'idée. Dans oneHasDownloaded, tu incrémentes un autre compteur ; quand il vaut this->filesDownloading et que tu peux finir (càd tous les fichiers sont lancés), alors tu as fini de télécharger les fichiers où tu veux qu'ils soient.
    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: 9
    Dernier message: 27/10/2005, 22h38
  2. [Delphi 2005] Comment parcourir la liste des fichiers ?
    Par babyface dans le forum Langage
    Réponses: 2
    Dernier message: 30/06/2005, 11h01
  3. Réponses: 7
    Dernier message: 19/09/2004, 22h01
  4. liste des fichiers d'un répertoire
    Par am dans le forum C
    Réponses: 3
    Dernier message: 04/08/2003, 17h03
  5. [Kylix] Liste des fichiers d'un répertoire
    Par Houben Jacques dans le forum EDI
    Réponses: 3
    Dernier message: 30/11/2002, 21h14

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