<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Linux Forum &mdash; Как скачать файл из проекта на Qt]]></title>
	<link rel="self" href="https://linuxforum.ru/extern.php?action=feed&amp;tid=9399&amp;type=atom" />
	<updated>2011-01-21T09:02:46Z</updated>
	<generator>PunBB</generator>
	<id>https://linuxforum.ru/viewtopic.php?id=9399</id>
		<entry>
			<title type="html"><![CDATA[Re: Как скачать файл из проекта на Qt]]></title>
			<link rel="alternate" href="https://linuxforum.ru/viewtopic.php?pid=134628#p134628" />
			<content type="html"><![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>]]></content>
			<author>
				<name><![CDATA[voral]]></name>
				<uri>https://linuxforum.ru/profile.php?id=841</uri>
			</author>
			<updated>2011-01-21T09:02:46Z</updated>
			<id>https://linuxforum.ru/viewtopic.php?pid=134628#p134628</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Как скачать файл из проекта на Qt]]></title>
			<link rel="alternate" href="https://linuxforum.ru/viewtopic.php?pid=133639#p133639" />
			<content type="html"><![CDATA[<p>Вообще, не в обиду этому форуму, есть отличный <a href="http://www.prog.org.ru/index.php">Russian Qt Forum</a>&nbsp; smile</p>]]></content>
			<author>
				<name><![CDATA[NioriX]]></name>
				<uri>https://linuxforum.ru/profile.php?id=3474</uri>
			</author>
			<updated>2011-01-18T11:06:58Z</updated>
			<id>https://linuxforum.ru/viewtopic.php?pid=133639#p133639</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Как скачать файл из проекта на Qt]]></title>
			<link rel="alternate" href="https://linuxforum.ru/viewtopic.php?pid=133503#p133503" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>Peter пишет:</cite><blockquote><p>Ведь после окончания Download.Initial из него и так произойдёт выход, дальше<br />можно будет или выйти или что-то делать с файлом.</p></blockquote></div><p>Только на момент выхода из Inital файл еще не скачан</p>]]></content>
			<author>
				<name><![CDATA[voral]]></name>
				<uri>https://linuxforum.ru/profile.php?id=841</uri>
			</author>
			<updated>2011-01-17T23:11:30Z</updated>
			<id>https://linuxforum.ru/viewtopic.php?pid=133503#p133503</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Как скачать файл из проекта на Qt]]></title>
			<link rel="alternate" href="https://linuxforum.ru/viewtopic.php?pid=133472#p133472" />
			<content type="html"><![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>]]></content>
			<author>
				<name><![CDATA[Peter]]></name>
				<uri>https://linuxforum.ru/profile.php?id=5246</uri>
			</author>
			<updated>2011-01-17T18:26:21Z</updated>
			<id>https://linuxforum.ru/viewtopic.php?pid=133472#p133472</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Как скачать файл из проекта на Qt]]></title>
			<link rel="alternate" href="https://linuxforum.ru/viewtopic.php?pid=133271#p133271" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>Peter пишет:</cite><blockquote><p>Совершенно верно, я уже плохо помню терминологию.<br />Но там уже есть startRequest, httpFinished, м.б., в него и вставить команду выхода?</p><p>Пётр.</p></blockquote></div><p>По скольку, как я понял, пишеться самодостаточный класс. То лучше будет добавить сигнал. Котрый будет издаваться по звершению закачки файла. И соеденить этот сигнал со слотом для выхода.</p>]]></content>
			<author>
				<name><![CDATA[voral]]></name>
				<uri>https://linuxforum.ru/profile.php?id=841</uri>
			</author>
			<updated>2011-01-17T09:40:34Z</updated>
			<id>https://linuxforum.ru/viewtopic.php?pid=133271#p133271</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Как скачать файл из проекта на Qt]]></title>
			<link rel="alternate" href="https://linuxforum.ru/viewtopic.php?pid=132716#p132716" />
			<content type="html"><![CDATA[<p>Совершенно верно, я уже плохо помню терминологию.<br />Но там уже есть startRequest, httpFinished, м.б., в него и вставить команду выхода?</p><p>Пётр.</p>]]></content>
			<author>
				<name><![CDATA[Peter]]></name>
				<uri>https://linuxforum.ru/profile.php?id=5246</uri>
			</author>
			<updated>2011-01-15T20:42:33Z</updated>
			<id>https://linuxforum.ru/viewtopic.php?pid=132716#p132716</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Как скачать файл из проекта на Qt]]></title>
			<link rel="alternate" href="https://linuxforum.ru/viewtopic.php?pid=132707#p132707" />
			<content type="html"><![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>]]></content>
			<author>
				<name><![CDATA[RasenHerz]]></name>
				<uri>https://linuxforum.ru/profile.php?id=14409</uri>
			</author>
			<updated>2011-01-15T20:25:15Z</updated>
			<id>https://linuxforum.ru/viewtopic.php?pid=132707#p132707</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Как скачать файл из проекта на Qt]]></title>
			<link rel="alternate" href="https://linuxforum.ru/viewtopic.php?pid=132648#p132648" />
			<content type="html"><![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>]]></content>
			<author>
				<name><![CDATA[Peter]]></name>
				<uri>https://linuxforum.ru/profile.php?id=5246</uri>
			</author>
			<updated>2011-01-15T16:12:22Z</updated>
			<id>https://linuxforum.ru/viewtopic.php?pid=132648#p132648</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Как скачать файл из проекта на Qt]]></title>
			<link rel="alternate" href="https://linuxforum.ru/viewtopic.php?pid=132635#p132635" />
			<content type="html"><![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>]]></content>
			<author>
				<name><![CDATA[RasenHerz]]></name>
				<uri>https://linuxforum.ru/profile.php?id=14409</uri>
			</author>
			<updated>2011-01-15T15:22:18Z</updated>
			<id>https://linuxforum.ru/viewtopic.php?pid=132635#p132635</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Как скачать файл из проекта на Qt]]></title>
			<link rel="alternate" href="https://linuxforum.ru/viewtopic.php?pid=132605#p132605" />
			<content type="html"><![CDATA[<p><strong>voral</strong><br />А без этого костыля можно как-нибудь?</p>]]></content>
			<author>
				<name><![CDATA[XRevan86]]></name>
				<uri>https://linuxforum.ru/profile.php?id=10073</uri>
			</author>
			<updated>2011-01-15T13:54:44Z</updated>
			<id>https://linuxforum.ru/viewtopic.php?pid=132605#p132605</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Как скачать файл из проекта на Qt]]></title>
			<link rel="alternate" href="https://linuxforum.ru/viewtopic.php?pid=132343#p132343" />
			<content type="html"><![CDATA[<p>Т.е. вам нужно дать время программе скачать нужный файл. Как это сделать зависит от вашего проекта и задачи.</p>]]></content>
			<author>
				<name><![CDATA[voral]]></name>
				<uri>https://linuxforum.ru/profile.php?id=841</uri>
			</author>
			<updated>2011-01-14T17:32:20Z</updated>
			<id>https://linuxforum.ru/viewtopic.php?pid=132343#p132343</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Как скачать файл из проекта на Qt]]></title>
			<link rel="alternate" href="https://linuxforum.ru/viewtopic.php?pid=132340#p132340" />
			<content type="html"><![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>]]></content>
			<author>
				<name><![CDATA[voral]]></name>
				<uri>https://linuxforum.ru/profile.php?id=841</uri>
			</author>
			<updated>2011-01-14T17:31:15Z</updated>
			<id>https://linuxforum.ru/viewtopic.php?pid=132340#p132340</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Как скачать файл из проекта на Qt]]></title>
			<link rel="alternate" href="https://linuxforum.ru/viewtopic.php?pid=132324#p132324" />
			<content type="html"><![CDATA[<p>Помогите, пожалуйста.<br />(это своеобразный &quot;UP&quot;).</p>]]></content>
			<author>
				<name><![CDATA[XRevan86]]></name>
				<uri>https://linuxforum.ru/profile.php?id=10073</uri>
			</author>
			<updated>2011-01-14T16:38:56Z</updated>
			<id>https://linuxforum.ru/viewtopic.php?pid=132324#p132324</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Как скачать файл из проекта на Qt]]></title>
			<link rel="alternate" href="https://linuxforum.ru/viewtopic.php?pid=128210#p128210" />
			<content type="html"><![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>]]></content>
			<author>
				<name><![CDATA[XRevan86]]></name>
				<uri>https://linuxforum.ru/profile.php?id=10073</uri>
			</author>
			<updated>2011-01-03T13:18:12Z</updated>
			<id>https://linuxforum.ru/viewtopic.php?pid=128210#p128210</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Как скачать файл из проекта на Qt]]></title>
			<link rel="alternate" href="https://linuxforum.ru/viewtopic.php?pid=127191#p127191" />
			<content type="html"><![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>]]></content>
			<author>
				<name><![CDATA[voral]]></name>
				<uri>https://linuxforum.ru/profile.php?id=841</uri>
			</author>
			<updated>2010-12-30T19:20:05Z</updated>
			<id>https://linuxforum.ru/viewtopic.php?pid=127191#p127191</id>
		</entry>
</feed>
