<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Linux Forum &mdash; Как скачать файл из проекта на Qt]]></title>
		<link>https://linuxforum.ru/viewtopic.php?id=9399</link>
		<atom:link href="https://linuxforum.ru/extern.php?action=feed&amp;tid=9399&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «Как скачать файл из проекта на Qt».]]></description>
		<lastBuildDate>Fri, 21 Jan 2011 09:02:46 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: Как скачать файл из проекта на Qt]]></title>
			<link>https://linuxforum.ru/viewtopic.php?pid=134628#p134628</link>
			<description><![CDATA[<p>На днях была необходимость написать нечто подобное. Т.е. нужно было дождаться скачивания и только потом грохаться. Сделал следующим образом.<br />во первых было добавлено в сам класс следующее:<br /></p><div class="codebox"><pre><code>...
private:
    void stopTimer(); //остановка таймера
    int timerId;  // Это id таймера. Таймер используем для реализации timeouta чтоб у нас навечно объект не повис
    bool fCanExit; //Это флаг возможности выхода. В конструкторе приравниваем к  true
    QEventLoop loop; //для реализации цикла обработки событий
protected:
    void timerEvent(QTimerEvent *event); //переопределяем процедуру обработки события таймера</code></pre></div><p>После отправки запроса get или post<br /></p><div class="codebox"><pre><code>....
    this-&gt;timerId = this-&gt;startTimer(10000); //Запускаем таймер который будет обереать нас от бесконечного ожидания ответа
    if (!this-&gt;loop.isRunning()) this-&gt;loop.exec(); //если наш цикл обработки еще не запущен то запускаем
                                                                          //возможно в этом вам нет необходимости. у меня есть возможность (некоторая специфика)
                                                                          // повторного захода в этот запрос. 
...</code></pre></div><p>Обработка события таймера<br /></p><div class="codebox"><pre><code>void VWebApi::timerEvent(QTimerEvent */* event */)
{
    this-&gt;stopTimer(); //останавливаем таймер. т.к. таймаут истек и нам уже он не нужен
    this-&gt;loop.exit(); //останавливем процесс обработки сообщений. Как только это произойдет мы выйдем 
                                // из метода отправляющего запрос (у вас Initial) и перейдем к следующей строке кода. Т.е. в вашем случае
                               // return 0 (main.cpp);
}</code></pre></div><p>Процедура остановки таймера. Возможно это тоже можно вам не использовать. Это моя специфика: если отправляется повторный запрос мне надо перезапускать таймер<br /></p><div class="codebox"><pre><code>void VWebApi::stopTimer()
{
    this-&gt;killTimer(this-&gt;timerId);
    this-&gt;timerId=0;
}</code></pre></div><p>Обработка сигнала окончания приема<br /></p><div class="codebox"><pre><code>void VWebApi::replyFinished(QNetworkReply* reply, replyType rplType)
{
...
   this-&gt;stopTimer(); // останавливаем таймер, чтобы у нас не грохнулся объект во время обработки
   fCanExit = // тут решаем можно уже выходить или нет
   if (this-&gt;fCanExit) this-&gt;loop.exit(); если можно то останавливаем обработку событий...
...
}</code></pre></div><p>VWebApi - это имя моего класса, соответственно меняйте на свое <img src="https://linuxforum.ru/img/smilies/ab.gif" alt="ab" /><br />Т.к. дернул со своего проекта с некоторой спецификой, так что может быть вам что то можно тут и &quot;почистить&quot;</p>]]></description>
			<author><![CDATA[null@example.com (voral)]]></author>
			<pubDate>Fri, 21 Jan 2011 09:02:46 +0000</pubDate>
			<guid>https://linuxforum.ru/viewtopic.php?pid=134628#p134628</guid>
		</item>
		<item>
			<title><![CDATA[Re: Как скачать файл из проекта на Qt]]></title>
			<link>https://linuxforum.ru/viewtopic.php?pid=133639#p133639</link>
			<description><![CDATA[<p>Вообще, не в обиду этому форуму, есть отличный <a href="http://www.prog.org.ru/index.php">Russian Qt Forum</a>&nbsp; smile</p>]]></description>
			<author><![CDATA[null@example.com (NioriX)]]></author>
			<pubDate>Tue, 18 Jan 2011 11:06:58 +0000</pubDate>
			<guid>https://linuxforum.ru/viewtopic.php?pid=133639#p133639</guid>
		</item>
		<item>
			<title><![CDATA[Re: Как скачать файл из проекта на Qt]]></title>
			<link>https://linuxforum.ru/viewtopic.php?pid=133503#p133503</link>
			<description><![CDATA[<div class="quotebox"><cite>Peter пишет:</cite><blockquote><p>Ведь после окончания Download.Initial из него и так произойдёт выход, дальше<br />можно будет или выйти или что-то делать с файлом.</p></blockquote></div><p>Только на момент выхода из Inital файл еще не скачан</p>]]></description>
			<author><![CDATA[null@example.com (voral)]]></author>
			<pubDate>Mon, 17 Jan 2011 23:11:30 +0000</pubDate>
			<guid>https://linuxforum.ru/viewtopic.php?pid=133503#p133503</guid>
		</item>
		<item>
			<title><![CDATA[Re: Как скачать файл из проекта на Qt]]></title>
			<link>https://linuxforum.ru/viewtopic.php?pid=133472#p133472</link>
			<description><![CDATA[<div class="quotebox"><cite>voral пишет:</cite><blockquote><div class="quotebox"><cite>Peter пишет:</cite><blockquote><p>Совершенно верно, я уже плохо помню терминологию.<br />Но там уже есть startRequest, httpFinished, м.б., в него и вставить команду выхода?</p><p>Пётр.</p></blockquote></div><p>По скольку, как я понял, пишеться самодостаточный класс. То лучше будет добавить сигнал. Котрый будет издаваться по звершению закачки файла. И соеденить этот сигнал со слотом для выхода.</p></blockquote></div><p>Согласен, это будет правильнее, но нужно ли это вобще?<br />Ведь после окончания Download.Initial из него и так произойдёт выход, дальше<br />можно будет или выйти или что-то делать с файлом.</p><p>Пётр.</p>]]></description>
			<author><![CDATA[null@example.com (Peter)]]></author>
			<pubDate>Mon, 17 Jan 2011 18:26:21 +0000</pubDate>
			<guid>https://linuxforum.ru/viewtopic.php?pid=133472#p133472</guid>
		</item>
		<item>
			<title><![CDATA[Re: Как скачать файл из проекта на Qt]]></title>
			<link>https://linuxforum.ru/viewtopic.php?pid=133271#p133271</link>
			<description><![CDATA[<div class="quotebox"><cite>Peter пишет:</cite><blockquote><p>Совершенно верно, я уже плохо помню терминологию.<br />Но там уже есть startRequest, httpFinished, м.б., в него и вставить команду выхода?</p><p>Пётр.</p></blockquote></div><p>По скольку, как я понял, пишеться самодостаточный класс. То лучше будет добавить сигнал. Котрый будет издаваться по звершению закачки файла. И соеденить этот сигнал со слотом для выхода.</p>]]></description>
			<author><![CDATA[null@example.com (voral)]]></author>
			<pubDate>Mon, 17 Jan 2011 09:40:34 +0000</pubDate>
			<guid>https://linuxforum.ru/viewtopic.php?pid=133271#p133271</guid>
		</item>
		<item>
			<title><![CDATA[Re: Как скачать файл из проекта на Qt]]></title>
			<link>https://linuxforum.ru/viewtopic.php?pid=132716#p132716</link>
			<description><![CDATA[<p>Совершенно верно, я уже плохо помню терминологию.<br />Но там уже есть startRequest, httpFinished, м.б., в него и вставить команду выхода?</p><p>Пётр.</p>]]></description>
			<author><![CDATA[null@example.com (Peter)]]></author>
			<pubDate>Sat, 15 Jan 2011 20:42:33 +0000</pubDate>
			<guid>https://linuxforum.ru/viewtopic.php?pid=132716#p132716</guid>
		</item>
		<item>
			<title><![CDATA[Re: Как скачать файл из проекта на Qt]]></title>
			<link>https://linuxforum.ru/viewtopic.php?pid=132707#p132707</link>
			<description><![CDATA[<div class="quotebox"><cite>Peter пишет:</cite><blockquote><p>это именно то, что вы пытаетесь сделать. Там в main тоже<br /></p><div class="codebox"><pre><code>return  app.exec();</code></pre></div><p>это стандартный спсоб запуска Qt-программ.</p></blockquote></div><p>Это способ запуска цикла обработки сообщений, который будет выполнятся до вызова функций quit() или exit(). Не надо никаких форм, просто в классе который скачивает файл надо создать сигнал downloadFinished() и сделать приблизительно следующее:<br /></p><div class="codebox"><pre><code>QApplication app(argc, argv);
MyOwnDownloader downloader;

downloader.connect(&amp;downloader, SIGNAL(downloadFinished()), &amp;app, SLOT(quit()));

/* тут начинаем качать файл */

return app.exec();</code></pre></div><p>Как-то так.</p>]]></description>
			<author><![CDATA[null@example.com (RasenHerz)]]></author>
			<pubDate>Sat, 15 Jan 2011 20:25:15 +0000</pubDate>
			<guid>https://linuxforum.ru/viewtopic.php?pid=132707#p132707</guid>
		</item>
		<item>
			<title><![CDATA[Re: Как скачать файл из проекта на Qt]]></title>
			<link>https://linuxforum.ru/viewtopic.php?pid=132648#p132648</link>
			<description><![CDATA[<p>А ещё установите qt4-doc-html, там есть /usr/share/qt4/doc/html/index.html,<br />в нём Tutorials and Examples, в Examples есть Network, в Network есть Download,<br />это именно то, что вы пытаетесь сделать. Там в main тоже<br /></p><div class="codebox"><pre><code>return  app.exec();</code></pre></div><p>это стандартный спсоб запуска Qt-программ.</p><p>Конечно, можно заканчивать програму изнутри и сразу после окончания<br />скачивания файла вызовом<br /></p><div class="codebox"><pre><code>this-&gt;close();</code></pre></div><p>кажется, так, сам давно уже в Qt ничего не делал.</p><p>Пётр.</p>]]></description>
			<author><![CDATA[null@example.com (Peter)]]></author>
			<pubDate>Sat, 15 Jan 2011 16:12:22 +0000</pubDate>
			<guid>https://linuxforum.ru/viewtopic.php?pid=132648#p132648</guid>
		</item>
		<item>
			<title><![CDATA[Re: Как скачать файл из проекта на Qt]]></title>
			<link>https://linuxforum.ru/viewtopic.php?pid=132635#p132635</link>
			<description><![CDATA[<div class="quotebox"><cite>Darth Revan пишет:</cite><blockquote><p><strong>voral</strong><br />А без этого костыля можно как-нибудь?</p></blockquote></div><p>Вместо <br /></p><div class="codebox"><pre><code>return 0;</code></pre></div><p>Сделайте <br /></p><div class="codebox"><pre><code>return app.exec();</code></pre></div><p>Где app - экземпляр QApplication.</p>]]></description>
			<author><![CDATA[null@example.com (RasenHerz)]]></author>
			<pubDate>Sat, 15 Jan 2011 15:22:18 +0000</pubDate>
			<guid>https://linuxforum.ru/viewtopic.php?pid=132635#p132635</guid>
		</item>
		<item>
			<title><![CDATA[Re: Как скачать файл из проекта на Qt]]></title>
			<link>https://linuxforum.ru/viewtopic.php?pid=132605#p132605</link>
			<description><![CDATA[<p><strong>voral</strong><br />А без этого костыля можно как-нибудь?</p>]]></description>
			<author><![CDATA[null@example.com (XRevan86)]]></author>
			<pubDate>Sat, 15 Jan 2011 13:54:44 +0000</pubDate>
			<guid>https://linuxforum.ru/viewtopic.php?pid=132605#p132605</guid>
		</item>
		<item>
			<title><![CDATA[Re: Как скачать файл из проекта на Qt]]></title>
			<link>https://linuxforum.ru/viewtopic.php?pid=132343#p132343</link>
			<description><![CDATA[<p>Т.е. вам нужно дать время программе скачать нужный файл. Как это сделать зависит от вашего проекта и задачи.</p>]]></description>
			<author><![CDATA[null@example.com (voral)]]></author>
			<pubDate>Fri, 14 Jan 2011 17:32:20 +0000</pubDate>
			<guid>https://linuxforum.ru/viewtopic.php?pid=132343#p132343</guid>
		</item>
		<item>
			<title><![CDATA[Re: Как скачать файл из проекта на Qt]]></title>
			<link>https://linuxforum.ru/viewtopic.php?pid=132340#p132340</link>
			<description><![CDATA[<p>Все просто.<br />1. Ошибка<br /></p><div class="codebox"><pre><code>if ( QFile::exists(FileName) )
{
      File-&gt;remove();
}</code></pre></div><p>меняем на <br /></p><div class="codebox"><pre><code>if ( QFile::exists(FileName) )
{
      File-&gt;remove(FileName);
}</code></pre></div><p>2. Ошибка и главная</p><p>Сколько живет ваш объект? <img src="https://linuxforum.ru/img/smilies/bx.gif" alt="bx" /> А ни сколько доли секунды. Соответственно ни чего не успевает принять. Достаточно в конце main.cpp&nbsp; сделать так<br /></p><div class="codebox"><pre><code>....
    QDialog dlg;
    dlg.exec();
    return 0;
}</code></pre></div><p>И вы получите свою картнку (Только окно не закрывайте моментально после открытия в данном примере это лишь костыль для создания задержки)</p>]]></description>
			<author><![CDATA[null@example.com (voral)]]></author>
			<pubDate>Fri, 14 Jan 2011 17:31:15 +0000</pubDate>
			<guid>https://linuxforum.ru/viewtopic.php?pid=132340#p132340</guid>
		</item>
		<item>
			<title><![CDATA[Re: Как скачать файл из проекта на Qt]]></title>
			<link>https://linuxforum.ru/viewtopic.php?pid=132324#p132324</link>
			<description><![CDATA[<p>Помогите, пожалуйста.<br />(это своеобразный &quot;UP&quot;).</p>]]></description>
			<author><![CDATA[null@example.com (XRevan86)]]></author>
			<pubDate>Fri, 14 Jan 2011 16:38:56 +0000</pubDate>
			<guid>https://linuxforum.ru/viewtopic.php?pid=132324#p132324</guid>
		</item>
		<item>
			<title><![CDATA[Re: Как скачать файл из проекта на Qt]]></title>
			<link>https://linuxforum.ru/viewtopic.php?pid=128210#p128210</link>
			<description><![CDATA[<p>main.cpp:</p><div class="codebox"><pre><code>#include &lt;iostream&gt;
#include &lt;cstdlib&gt;
#include &lt;string&gt;
#include &lt;QApplication&gt;
#include &lt;QDir&gt;

#include &quot;functions.h&quot;

QString CD = PChar2QString(&quot;&quot;);

int main(int ParamCount, char* ParamStr[])
{
    QApplication Application(ParamCount, ParamStr);
    QURLDownloadToFile DownloadFile;
    QConfigFile ConfigFile;
    CD = Application.applicationDirPath();
    ConfigFile.Save(CD + QDir::separator() + PChar2QString(&quot;hello.ini&quot;), PChar2QString(&quot;Main&quot;), PChar2QString(&quot;DefaultValue&quot;),
                    PChar2QString(&quot;HelloWorld&quot;));
    DownloadFile.Initial(PChar2QString(&quot;http://www.google.ru/images/srpr/nav_logo27.png&quot;), PChar2QString(&quot;google.png&quot;));
    return 0;
}</code></pre></div><p>functions.cpp:</p><div class="codebox"><pre><code>#include &lt;QtCore&gt;
#include &lt;QObject&gt;
#include &lt;QDir&gt;
#include &lt;QtNetwork&gt;
#include &lt;QNetworkAccessManager&gt;
#include &lt;QNetworkRequest&gt;
#include &lt;QNetworkReply&gt;
#include &lt;QUrl&gt;

#include &quot;functions.h&quot;

QString PChar2QString(const char* PChar)
{
    return QString(&quot;%1&quot;).arg(PChar);
}

char* QString2PChar(const QString String)
{
    QByteArray Result = String.toAscii();
    return Result.data();
}

QURLDownloadToFile::QURLDownloadToFile(QObject* parent): QObject(parent)
{
}

void QURLDownloadToFile::startRequest(QUrl URL)
{
    Reply = qnam.get(QNetworkRequest(URL));
    connect(Reply, SIGNAL(finished()),
            this, SLOT(httpFinished()));
    connect(Reply, SIGNAL(readyRead()),
            this, SLOT(httpReadyRead()));
}

void QURLDownloadToFile::Initial(QString StringURL, QString FileName)
{
    URL.setUrl(StringURL);
    if ( FileName == PChar2QString(&quot;&quot;) ) {
      QFileInfo fileInfo(URL.path());
      FileName = fileInfo.fileName();
    }
    if ( QFile::exists(FileName) ) {
      File-&gt;remove();
    }

    File = new QFile(FileName);
    if ( !File-&gt;open(QIODevice::WriteOnly) ) {
        delete File;
        File = 0;
        return;
    }
    httpRequestAborted = false;
    startRequest(URL);
}

void QURLDownloadToFile::httpFinished()
{
    File-&gt;flush();
    File-&gt;close();
    Reply-&gt;deleteLater();
    Reply = 0;
    delete File;
    File = 0;
}

void QURLDownloadToFile::httpReadyRead()
{
    if ( File )
        File-&gt;write( Reply-&gt;readAll() );
}

QConfigFile::QConfigFile(QObject *parent): QObject(parent)
{
}

QString QConfigFile::Read(const QString FileName, const QString Section, const QString Value,
                             const QString Default)
{
    IniFile = FileName;
    QSettings Settings(IniFile, QSettings::IniFormat);
    Settings.beginGroup(Section);
    Result = Settings.value(Value, &quot;&quot;).toString();
    if ( Result == &quot;&quot; )
        Result = Default;
    Settings.endGroup();
    return Result;
}

void QConfigFile::Save(const QString FileName, const QString Section, const QString Value, const QString InValue)
{
    IniFile = FileName;
    QSettings Settings(IniFile, QSettings::IniFormat);
    Settings.beginGroup(Section);
    Settings.setValue(Value, InValue);
    Settings.endGroup();
}</code></pre></div><p>functions.h:</p><div class="codebox"><pre><code>#ifndef FUNCTIONS_H
#define FUNCTIONS_H

#include &lt;QObject&gt;
#include &lt;QNetworkAccessManager&gt;
#include &lt;QUrl&gt;

QString PChar2QString(const char* PChar);
char* QString2PChar(const QString String);

QT_BEGIN_NAMESPACE
class QFile;
class QNetworkReply;
class QNetworkRequest;
QT_END_NAMESPACE

class QURLDownloadToFile: public QObject
{
    Q_OBJECT

public:
    QURLDownloadToFile(QObject* parent = 0);
    void Initial(QString StringURL, QString FileName);

private slots:
    void startRequest(QUrl URL);
    void httpFinished();
    void httpReadyRead();

private:
    QUrl URL;
    QNetworkAccessManager qnam;
    QNetworkReply* Reply;
    QFile* File;
    int httpGetId;
    bool httpRequestAborted;
};

class QConfigFile: public QObject
{
    Q_OBJECT

public:
    QConfigFile(QObject* parent = 0);
    QString Read(const QString FileName, const QString Section, const QString Value,
              const QString Default);
    void Save(const QString FileName, const QString Section, const QString Value, const QString InValue);

private:
    QString Result;
    QString IniFile;
};

#endif</code></pre></div><p>Файл пустой.</p>]]></description>
			<author><![CDATA[null@example.com (XRevan86)]]></author>
			<pubDate>Mon, 03 Jan 2011 13:18:12 +0000</pubDate>
			<guid>https://linuxforum.ru/viewtopic.php?pid=128210#p128210</guid>
		</item>
		<item>
			<title><![CDATA[Re: Как скачать файл из проекта на Qt]]></title>
			<link>https://linuxforum.ru/viewtopic.php?pid=127191#p127191</link>
			<description><![CDATA[<div class="quotebox"><cite>Darth Revan пишет:</cite><blockquote><p>Всё, я перехожу на ООП.<br />Ещё раз спасибо voral и Civil smile. Желаю вам много радости <s>и конца света</s> в Новом Году!</p><p><strong>voral</strong><br />Да... в Вашем коде 0 Бит получается <img src="https://linuxforum.ru/img/smilies/ag.gif" alt="ag" />.</p></blockquote></div><p>странно у меня скачалась вся страниуа</p>]]></description>
			<author><![CDATA[null@example.com (voral)]]></author>
			<pubDate>Thu, 30 Dec 2010 19:20:05 +0000</pubDate>
			<guid>https://linuxforum.ru/viewtopic.php?pid=127191#p127191</guid>
		</item>
	</channel>
</rss>
