Название: Загрузка изображений с удаленного сервера
Отправлено: vvvxmag от Февраль 20, 2013, 11:39
Пытаюсь загрузить и сохранить картинку с удаленного сервера следующим образом void Pict_grab::press_btn_load() { QNetworkAccessManager *manager = new QNetworkAccessManager(this); connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(replyFinished(QNetworkReply*))); QNetworkReply* rep1 = manager->get(QNetworkRequest(QUrl("www.google.com"))); connect(rep1, SIGNAL(finished()),this, SLOT(repfinish())); connect(rep1, SIGNAL(readyRead()), this, SLOT(repfinish()));
} void Pict_grab::replyFinished(QNetworkReply* fin) { QImage img; QImageReader reader(fin); if (fin->error() == QNetworkReply::NoError) reader.read(&img); else qWarning() << QString("[NetworkingPrivate] Reply error: %1").arg(fin->error()); img.save("c:\\img1.jpg","JPG"); } void Pict_grab::repfinish() { int i=0; }
коннекты устанавливаются нормально, но ни в один из слотов не попадаю. Как загрузить изображение по ссылке?
Название: Re: Загрузка изображений с удаленного сервера
Отправлено: vvvxmag от Февраль 20, 2013, 16:20
нашел вот такой код QNetworkAccessManager m; QNetworkReply * reply = m.get( QNetworkRequest( url ) ); QEventLoop loop; connect( reply, SIGNAL(finished()), &loop, SLOT(quit()) ); loop.exec(); if ( reply->error() == QNetworkReply::NoError ) { QFile image( "image.jpg" ); image.open( QIODevice::WriteOnly ); image.write( reply->readAll() ); } http://www.prog.org.ru/topic_11744_0.html сделал так QNetworkAccessManager m; QNetworkReply * reply = m.get( QNetworkRequest( QUrl("http://ru.fishki.net/picsw/022013/20/kino/tn.jpg") ) ); QEventLoop loop; connect( reply, SIGNAL(finished()), &loop, SLOT(quit()) ); connect( reply, SIGNAL(error(QNetworkReply::NetworkError )), this, SLOT(load_error(QNetworkReply::NetworkError ))); connect( reply, SIGNAL(uploadProgress(qint64, qint64)), this, SLOT(load_progress( qint64 , qint64 ))); loop.exec(); if ( reply->error() == QNetworkReply::NoError ) { QFile image( "c:\\image.jpg" ); image.open( QIODevice::WriteOnly ); image.write( reply->readAll() ); } но на loop.exec() - зависает, ждал минуты 2-3 больше терпения не хватило. В чем может быть проблема?
Название: Re: Загрузка изображений с удаленного сервера
Отправлено: GreatSnake от Февраль 20, 2013, 16:29
Дык понятно же, что finished() не срабатывает, т.к. происходит какая-то ошибка. Нужно подцепиться к error(QNetworkReply::NetworkError).
Название: Re: Загрузка изображений с удаленного сервера
Отправлено: vvvxmag от Февраль 20, 2013, 16:39
Подключил все сигналы, ни один не срабатывает
Название: Re: Загрузка изображений с удаленного сервера
Отправлено: GreatSnake от Февраль 21, 2013, 10:02
Вот тебе рабочий пример вьювера удалённых изображений: C++ (Qt) #include <QApplication> #include <QImage> #include <QMessageBox> #include <QNetworkAccessManager> #include <QNetworkRequest> #include <QNetworkReply> #include <QNetworkProxy> #include <QPainter> #include <QPaintEvent> #include <QProgressDialog> class ImgViewer : public QWidget { public: ImgViewer( const QImage& img, QWidget* p = 0 ) : QWidget( p ) , bg( img ) { br.setTextureImage( bg ); } protected: void paintEvent( QPaintEvent* e ) { QPainter p( this ); br.setMatrix( QMatrix( qreal( width() ) / qreal( bg.width() ), 0, 0, qreal( height() ) / qreal( bg.height() ), 0, 0 ) ); p.setPen( Qt::NoPen ); p.setBrush( br ); p.drawRect( e->rect() ); } QImage bg; QBrush br; }; class UrlImage : public QObject, public QImage, public QNetworkRequest { Q_OBJECT public: UrlImage( const QString& url, QObject* parent = 0 ) : QObject( parent ) , QNetworkRequest( url ) { QNetworkAccessManager am; QNetworkReply* reply = am.get( *this ); connect( reply, SIGNAL(finished()), this, SLOT(requestFinished()) ); QEventLoop loop; QProgressDialog pd( "Loading image...", "Interrupt", 0, 0 ); connect( &pd, SIGNAL( canceled() ), &loop, SLOT(quit()) ); pd.show(); connect( reply, SIGNAL(finished()), &loop, SLOT(quit()) ); connect( reply, SIGNAL(error(QNetworkReply::NetworkError)), &loop, SLOT(quit()) ); loop.exec(); } private: UrlImage( const UrlImage& ) {} protected Q_SLOTS: void requestFinished() { QNetworkReply* reply = qobject_cast< QNetworkReply* >( sender() ); QNetworkReply::NetworkError err = reply->error(); if( err != QNetworkReply::NoError ) { QMessageBox::warning( 0, "Error", reply->errorString() ); } else { QString path( reply->url().path() ); QString suffix( path.mid( path.lastIndexOf( '.' ) + 1 ) ); QImage::load( reply, suffix.toLatin1().constData() ); } reply->deleteLater(); } }; int main( int argc, char** argv ) { QApplication app( argc, argv ); if( argc < 2 ) { QMessageBox::warning( 0, "Error", "No URL specified." ); return 1; } QString proxy = qgetenv( "http_proxy" ); if( !proxy.isEmpty() ) { QRegExp rx( "http://(\\S+):(\\d+)" ); if( rx.indexIn( proxy ) != -1 ) { QNetworkProxy::setApplicationProxy( QNetworkProxy( QNetworkProxy::HttpProxy, rx.cap( 1 ), rx.cap( 2 ).toInt() ) ); } } UrlImage img( argv[1] ); if( img.isNull() ) return 1; ImgViewer w( img ); w.show(); return app.exec(); }
|