8
votes

Téléchargement de fichier en qt de l'URL

Dans mon programme, j'ai besoin de télécharger un fichier et je suis tombé sur cet article:

http://www.java2s.com/code/cpp/qt/downloadfromurl.htm

Ce code fonctionne, mais cela ne rentre pas dans mon programme, donc je re-codé. Je n'ai pas tout achevé mais j'ai les bases codées. Cependant, lorsque je le teste, il apparaît avec une fenêtre de rapport d'erreur d'envoi.

jusqu'à présent, c'est mon code:

qtdownload.h xxx < /pregre >p>qtdownload.cppppightdownload.cpppleddownload.free.comxxx --p>main.cpppledleightleight/pre> J'ai dit que ce n'est pas complètement fini mais Je veux que cette partie fonctionne avant de passer à autre chose.

Je suis aussi nouveau à QT afin que des conseils soient appréciés.


0 commentaires

3 Réponses :


3
votes

Vous avez besoin QcoreApplication pour démarrer la boucle d'événement pour qt4. Quelque chose comme ça devrait fonctionner (non testé): xxx

edit :: nouvelle version

J'ai trouvé des problèmes:

  1. Vous n'avez pas besoin de la réponse personnalisée, vous ne le réglez jamais à 0 dans votre constructeur, alors s'il n'a jamais été utilisé, il supprimera une pièce de mémoire aléatoire dans votre ~ qtDownload ();
  2. Vous avez supprimé DATA INTÉRIED QTDOWLOAD :: Downloadfinished , qui ne devrait pas être fait, il est manipulé par qt, de sorte qu'il soit supprimé deux fois.
  3. à cause de # 2, vous supprimez réponse 3 fois.

    Voici la version modifiée:

    qtdownload.h : xxx

    qtownload. CPP : xxx

    main.cpp : xxx


4 commentaires

Expliqué dans ma réponse. Principalement, il s'agit de "Qt les gère"


Merci pour les réponses et les conseils, je le testerai maintenant et post-retour


Le code oneOfone écrit fonctionne. Juste une question montrant mon inexpérience, à la ligne 10, il quitte l'application une fois téléchargée, maintenant si je l'ai commentée, cela passerait-il à la ligne suivante avant de terminer le téléchargement que je pense que cela le fait et si oui, comment puis-je le faire Attendez que terminé ait été émis? De plus, si j'utilise pour écrire des morceaux de données de manière inconsciente si les données étaient importantes (dans ce programme, les fichiers ne seront que 2 Mo) de quel signal serais-je utilisé. J'ai regardé sur les documents Qt mais je n'ai pas trouvé de signal réel qui gère de recevoir des morceaux à la fois? Je vous remercie


Dans Main.CPP, vous devez d'abord vous connecter, puis télécharger uniquement. En général, n'accordez pas un nouveau fil avant que vos connexions soient configurées.



7
votes
  • Vous utilisez un pointeur ininitialisé, il ne pointe donc de nulle part. Initialiser Répondre avec null dans votre constructeur.
  • Vous devez connecter Répondre après avoir été créé ( Répondre = manager.get (...) ), pas à l'intérieur de votre constructeur.
  • qnetworkreply n'est jamais supprimé par qNetworkManager comme Docs disent :

    Ne supprimez pas l'objet de réponse dans l'emplacement connecté à ce signal. Utilisez Supprimer ().

    Vous ne devez donc pas appeler supprimer sur qnetworkreply dans terminé emplacement.

    • in terminé Réglage de l'emplacement DATA à 0 ne définit que la valeur du paramètre sur 0 , pas votre membre de la classe Répondre . C'est une ligne de code inutile. Vous devez définir votre membre réponse sur null à la place.

      Vous devez également envisager d'écrire dans un fichier chaque fois que vous obtenez des données de données, en tant que fichier entier en mémoire tampon dans votre cas en cours. Cela peut entraîner une énorme utilisation de la mémoire de votre logiciel lorsque le fichier à l'URL pointue est grand.


0 commentaires

1
votes

Comme vous l'avez demandé, certains commentaires généraux:

if (reply != 0)
    delete reply;


0 commentaires