QtWebKit рдореЗрдВ рд▓реЛрдб рдХрд┐рдП рдЧрдП рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХрд╛ рдЕрд╡рд░реЛрдзрди рдпрд╛ рдореИрдВрдиреЗ рдбрдмрд╕реНрдЯреЗрдк рдХреЗ рддрд╣рдд рдЗрдХрд╕рд┐рдВрдЧреЛрдВ рдХреЛ рдХреИрд╕реЗ рджреБрдЦреА рдХрд┐рдпрд╛


Habrahabr::Instance()->hello();


рдореИрдВрдиреЗ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдХреБрдЫ рднреА рдирд╣реАрдВ рд▓рд┐рдЦрд╛ рд▓реЗрдХрд┐рди рдкрд┐рдЫрд▓реЗ рд╣рдлреНрддреЗ рдореИрдВрдиреЗ QtWebkit 5.1 рдореЙрдбреНрдпреВрд▓ рдХреЗ рд╕рд╛рде ** рдмрд╣реБрдд рд╣рд┐рд▓рд╛ рджрд┐рдпрд╛ рдФрд░ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдХрд┐ рдЖрдкрдХреЛ рдпрд╣ рдмрддрд╛рдиреЗ рдореЗрдВ рдЕрдЪреНрдЫрд╛ рд▓рдЧреЗрдЧрд╛ рдХрд┐ рдЖрдкрдХреЛ рд╡рд╣рд╛рдБ рдХреНрдпрд╛ рдкрд░реЗрд╢рд╛рдиреА рд╣реИ, рдЕрдЧрд░ рдЖрдк рд╕реНрдХреНрд░реАрди рдХреА рдЫрд╡рд┐ рдпрд╛ рдЙрд╕ рддрд░рд╣ рдХреА рдЪреАрдЬрд╝ рдХреЛ рдкрдХрдбрд╝рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдореЗрд░рд╛ рдХрд╛рдо рдПрдХ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдмрдирд╛рдирд╛ рдерд╛ рдЬреЛ рд╕рднреА рдкреГрд╖реНрдареЛрдВ рд╕реЗ рд╕рднреА рдЫрд╡рд┐рдпреЛрдВ рдХреЛ рдмрдЪрд╛рддрд╛ рд╣реИ рдЬреЛ рдЗрд╕реЗ рдмреНрд░рд╛рдЙрдЬрд╝ рдХрд░рддрд╛ рд╣реИред рдкреНрд░рд╛рдердорд┐рдХ рдХрд╛рд░реНрдп, рдкрд╣рд▓реА рдирдЬрд╝рд░ рдореЗрдВ: рд╣реИрдВрдбрд▓рд░ рдХреЛ рдПрдХ рдЕрд▓рдЧ рдереНрд░реЗрдб рдкрд░ рд▓рдЯрдХрд╛рдПрдВ, рдЬреЛ рдЪрдпрдирдХрд░реНрддрд╛ "img" рджреНрд╡рд╛рд░рд╛ рд╕рднреА QWebElement рдкрд░ рдкреБрдирд░рд╛рд╡реГрддреНрдд рдХрд░рддрд╛ рд╣реИ рдФрд░ QImage рдкрд░ QPebter рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЙрдирдХреА рд╕рд╛рдордЧреНрд░реА (QWebElement :: рд░реЗрдВрдбрд░ ()) рдЦреАрдВрдЪрддрд╛ рд╣реИ, рдЬреЛ рдмрджрд▓реЗ рдореЗрдВ, рдПрдХ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕рд╣реЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИред

рд▓реЗрдХрд┐рди рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рд╕рдм рдХреБрдЫ рдЗрддрдирд╛ рд╕рд░рд▓ рдирд╣реАрдВ рд╣реИ, рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗред рд╕рдореБрд░рд╛рдИ рдХреЗ рдорд╛рд░реНрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ, рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рдЗрд╕ рдкрдж рдХреЗ рдХрдЯреМрддреА рдХреЗ рддрд╣рдд рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд╛рд░реНрдп рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд┐рдпрд╛ рдерд╛ред рдмреЛрди рдПрдкреЗрдЯрд┐рдЯ!


рдЪрд░рдг 1. рд╕рдорд╕реНрдпрд╛


рдореИрдВрдиреЗ рдореИрдХ рдкрд░ рдЬреАрдЖрдИрдЯреА рд╕реЗ рд╕рдмрд╕реЗ рд╣рд╛рд▓ рдХреЗ рдХреНрдпреВрдЯреА 5 рдкрд░ рдкрд┐рдЫрд▓реЗ рдкреИрд░рд╛рдЧреНрд░рд╛рдл рдореЗрдВ рджрд┐рдП рдЧрдП рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛, рдЬрд┐рд╕рд╕реЗ рдХреНрд▓реИрдВрдЧ 64-рдмрд┐рдЯ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рд╣реБрдЖред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рдерд╛ред рд╕рднреА рд╕рд╣реЗрдЬреА рдЧрдИ рдЫрд╡рд┐рдпрд╛рдВ рдпрд╛ рддреЛ рдХрд╛рд▓реА рдЖрдпрддреЗрдВ рдереАрдВ рдпрд╛ рдирд░рдХ рдХрдЪрд░рд╛ред рдпрд╣ рддрдм рдерд╛ рдЬрдм рдореБрдЭреЗ рдпрд╛рдж рдЖрдпрд╛ рдХрд┐ рдХреНрдпреВрдЯреА 5 рдХреА рдбрд┐рд▓реАрд╡рд░реА рд╕реЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ, рдЬреЛ рд╕рдорд╛рди рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред рдореИрдВрдиреЗ рдЬрд▓реНрджреА рд╕реЗ рдЗрд╕реЗ рдЗрдХрдЯреНрдард╛ рдХрд┐рдпрд╛ рдФрд░ рдЗрд╕реЗ README рдореЗрдВ рд╕рдВрдХреЗрдд рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ред рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдЙрджрд╛рд╣рд░рдг, рд╡рд┐рдЪрд┐рддреНрд░ рд░реВрдк рд╕реЗ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ, рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдореИрдВрдиреЗ рдЗрд╕реЗ рд▓рд┐рдирдХреНрд╕ рдкрд░ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ - рдЗрд╕реА рддрд░рд╣ред

рдФрд░ рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИ? рд▓реЗрдХрд┐рди рдХреБрдЫ рднреА рдирд╣реАрдВ, рдпрд╣ рдмрд╛рдд рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддреА рд╣реИ рдФрд░ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреНрдпреЛрдВред рдореЗрд░реЗ рдкрд╛рд╕ рдЗрд╕рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХрд╛ рд╕рдордп рдирд╣реАрдВ рдерд╛, рдЗрд╕рд▓рд┐рдП рдореИрдВ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╕рдорд╛рдзрд╛рди рдХреА рддрд▓рд╛рд╢ рдореЗрдВ рдерд╛ред рдореИрдВрдиреЗ рдХреЛрд╢рд┐рд╢ рдХреА, рд╕реНрдЯреВрдбрд┐рдпреЛ рдореЗрдВ рдкреНрд░рд▓реЛрднрдиреЛрдВ рдХреЗ рдорд╣рд╛рд╢рдп, рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдмреИрдХрдПрдВрдб рдкрд░ рдЫрд╡рд┐рдпреЛрдВ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд┐рдзрд┐ред рдпрд╣ рд╡рд┐рдзрд┐ рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИ - рд╣рдо рдПрдХ рддрд╕реНрд╡реАрд░ рд▓реЗрддреЗ рд╣реИрдВ, рдЗрд╕реЗ рдХреИрдирд╡рд╛рд╕ рдкрд░ рдЦреАрдВрдЪрддреЗ рд╣реИрдВ рдФрд░ рдХреИрдирд╡рд╛рд╕ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдЖрдзрд╛рд░ 64 рдореЗрдВ рдмреИрдХрдПрдВрдб рдкрд░ рднреЗрдЬрддреЗ рд╣реИрдВред рд╡рд╣рд╛рдВ рд╣рдо рдПрдХ рд╕реНрдкрд╖реНрдЯ рдЫрд╡рд┐ рдореЗрдВ рдбрд┐рдХреЛрдб, рд╕рд╛рдл рдФрд░ рдЕрдиреБрд╡рд╛рдж рдХрд░рддреЗ рд╣реИрдВред

рд╢рд░реНрдордирд╛рдХ! рдЗрд╕ рдкрджреНрдзрддрд┐ рдиреЗ рдореБрдЭреЗ рдкрд┐рдЫрд▓реЗ рдЪрд┐рддреНрд░ рдХреЗ рд╕рдорд╛рди рдЫрд╡рд┐рдпрд╛рдВ рдкреНрд░рджрд╛рди рдХреАрдВред рдпрд╣рд╛рдВ рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЧрд▓рдд рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рднрд╛рдЧ рд░рд╣рд╛ рд╣реВрдВ, рдореЗрд░реЗ рдкрд╛рд╕ рд╡рд╛рдкрд╕ рджреЗрдЦрдиреЗ рдХрд╛ рд╕рдордп рдирд╣реАрдВ рд╣реИ рдФрд░ рдлрд┐рд░ рдПрдХ рдФрд░ рдирд┐рд░реНрдгрдп рдХрд╛ рдЬрдиреНрдо рд╣реЛрддрд╛ рд╣реИ!


рдЪрд░рдг 2. рд╕рдорд╛рдзрд╛рди


рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рд╣рдо рдЙрди рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рд░реЛрдХрддреЗ рд╣реИрдВ рдЬреЛ рдкреГрд╖реНрда рд▓реЛрдб рдХрд░рддреЗ рд╣реИрдВ? рдХреНрдпреЛрдВ рдирд╣реАрдВ, рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ред рдЬрд▓реНрджреА рд╕реЗ рдбреЙрдХ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЫреЛрдбрд╝ рджрд┐рдпрд╛ QNetworkAccessManager - рд╣реБрд░реНрд░реЗ! рдФрд░ рдпрд╣рд╛рдБ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ QWebView рд╣реИ, рдЬрд┐рд╕реЗ рд╣рдо рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдкрд╣рд▓реЗ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд╕реНрдЯрдо QNetworkAccessManager рдХреЗ рд╕рд╛рде QWebPage рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╣рдорд╛рд░реА рдХрдХреНрд╖рд╛ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯрд░рдореИрдирд░ (QNAM рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реА) рд╣реИред

InterceptorManager рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдХреБрдЫ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:

 class InterceptorManager : public QNetworkAccessManager { Q_OBJECT public: explicit InterceptorManager(QObject *parent = 0); protected: QNetworkReply *createRequest(Operation op, const QNetworkRequest &request, QIODevice *outgoingData) { QNetworkReply *real = QNetworkAccessManager::createRequest(op, request, outgoingData); if (request.url().toString().endsWith(".png")) { NetworkReplyProxy *proxy = new NetworkReplyProxy(this, real); return proxy; } return real; } }; 

рд╣рдо createRequest () рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рд╕рднреА рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд▓рд┐рдП рд╣рдо QNetworkReply рд╡рд░реНрдЧ рдкреНрд░реЙрдХреНрд╕реА рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рд╣рдордиреЗ рдмрдирд╛рдпрд╛ рдерд╛ред рдпрд╣ рдХреНрдпреЛрдВ рдЖрд╡рд╢реНрдпрдХ рд╣реИ? QNetworkReply, QIODevice рдХреЗ рд╡рдВрд╢рдЬ рдХреЗ рд░реВрдк рдореЗрдВ, рдлрд┐рд░ рд╕реЗ рд╕рд╛рдордЧреНрд░реА рдХреЛ рдкрдврд╝рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдирд╣реАрдВ рд╣реИред рдЪреВрдВрдХрд┐ рд╣рдореЗрдВ рдЫрд╡рд┐ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП QWebPage рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдПрдХ рдкреНрд░реЙрдХреНрд╕реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рд╣рдо рд╕рд╛рдордЧреНрд░реА рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдмрд╛рдж рдореЗрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЪреВрдВрдХрд┐ QNetworkReply рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдирд╛ рдЖрд╕рд╛рди рдХрд╛рдо рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП, рдореИрдВ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреВрдВрдЧрд╛:
networkreplyproxy.h (рдкрджрд╛рд╡рдирдд - рдиреАрдЪреЗ рдХреЗ рднрдВрдбрд╛рд░ рдореЗрдВ рд╕рдмрд╕реЗ рд╣рд╛рд▓ рд╣реА рдореЗрдВ)
 #include <QApplication> #include <QWebFrame> #include <QWebPage> #include <QWebView> #include <QWebSettings> #include <QDebug> #include <QDateTime> #include <QDebug> #include <QFile> #include <QTimer> #include <QNetworkProxy> #include <QNetworkReply> #include <QNetworkCookie> class NetworkReplyProxy : public QNetworkReply { Q_OBJECT public: NetworkReplyProxy(QObject* parent, QNetworkReply* reply) : QNetworkReply(parent) , m_reply(reply) { // apply attributes... setOperation(m_reply->operation()); setRequest(m_reply->request()); setUrl(m_reply->url()); // handle these to forward connect(m_reply, SIGNAL(metaDataChanged()), SLOT(applyMetaData())); connect(m_reply, SIGNAL(readyRead()), SLOT(readInternal())); connect(m_reply, SIGNAL(error(QNetworkReply::NetworkError)), SLOT(errorInternal(QNetworkReply::NetworkError))); // forward signals connect(m_reply, SIGNAL(finished()), SIGNAL(finished())); connect(m_reply, SIGNAL(uploadProgress(qint64,qint64)), SIGNAL(uploadProgress(qint64,qint64))); connect(m_reply, SIGNAL(downloadProgress(qint64,qint64)), SIGNAL(downloadProgress(qint64,qint64))); // for the data proxy... setOpenMode(ReadOnly); } ~NetworkReplyProxy() { if (m_reply->url().scheme() != "data") writeDataPrivate(); delete m_reply; } // virtual methids void abort() { m_reply->abort(); } void close() { m_reply->close(); } bool isSequential() const { return m_reply->isSequential(); } // not possible... void setReadBufferSize(qint64 size) { QNetworkReply::setReadBufferSize(size); m_reply->setReadBufferSize(size); } // ssl magic is not done.... // isFinished()/isRunning can not be done *sigh* // QIODevice proxy... virtual qint64 bytesAvailable() const { return m_buffer.size() + QIODevice::bytesAvailable(); } virtual qint64 bytesToWrite() const { return -1; } virtual bool canReadLine() const { qFatal("not implemented"); return false; } virtual bool waitForReadyRead(int) { qFatal("not implemented"); return false; } virtual bool waitForBytesWritten(int) { qFatal("not implemented"); return false; } virtual qint64 readData(char* data, qint64 maxlen) { qint64 size = qMin(maxlen, qint64(m_buffer.size())); memcpy(data, m_buffer.constData(), size); m_buffer.remove(0, size); return size; } signals: void resourceIntercepted(QByteArray); public Q_SLOTS: void ignoreSslErrors() { m_reply->ignoreSslErrors(); } void applyMetaData() { QList<QByteArray> headers = m_reply->rawHeaderList(); foreach(QByteArray header, headers) setRawHeader(header, m_reply->rawHeader(header)); setHeader(QNetworkRequest::ContentTypeHeader, m_reply->header(QNetworkRequest::ContentTypeHeader)); setHeader(QNetworkRequest::ContentLengthHeader, m_reply->header(QNetworkRequest::ContentLengthHeader)); setHeader(QNetworkRequest::LocationHeader, m_reply->header(QNetworkRequest::LocationHeader)); setHeader(QNetworkRequest::LastModifiedHeader, m_reply->header(QNetworkRequest::LastModifiedHeader)); setHeader(QNetworkRequest::SetCookieHeader, m_reply->header(QNetworkRequest::SetCookieHeader)); setAttribute(QNetworkRequest::HttpStatusCodeAttribute, m_reply->attribute(QNetworkRequest::HttpStatusCodeAttribute)); setAttribute(QNetworkRequest::HttpReasonPhraseAttribute, m_reply->attribute(QNetworkRequest::HttpReasonPhraseAttribute)); setAttribute(QNetworkRequest::RedirectionTargetAttribute, m_reply->attribute(QNetworkRequest::RedirectionTargetAttribute)); setAttribute(QNetworkRequest::ConnectionEncryptedAttribute, m_reply->attribute(QNetworkRequest::ConnectionEncryptedAttribute)); setAttribute(QNetworkRequest::CacheLoadControlAttribute, m_reply->attribute(QNetworkRequest::CacheLoadControlAttribute)); setAttribute(QNetworkRequest::CacheSaveControlAttribute, m_reply->attribute(QNetworkRequest::CacheSaveControlAttribute)); setAttribute(QNetworkRequest::SourceIsFromCacheAttribute, m_reply->attribute(QNetworkRequest::SourceIsFromCacheAttribute)); setAttribute(QNetworkRequest::DoNotBufferUploadDataAttribute, m_reply->attribute(QNetworkRequest::DoNotBufferUploadDataAttribute)); emit metaDataChanged(); } void errorInternal(QNetworkReply::NetworkError _error) { setError(_error, errorString()); emit error(_error); } void readInternal() { QByteArray data = m_reply->readAll(); m_data += data; m_buffer += data; emit readyRead(); } protected: void writeDataPrivate() { QByteArray httpHeader; QList<QByteArray> headers = rawHeaderList(); foreach(QByteArray header, headers) { if (header.toLower() == "content-encoding" || header.toLower() == "transfer-encoding" || header.toLower() == "content-length" || header.toLower() == "connection") continue; // special case for cookies.... we need to generate separate lines // QNetworkCookie::toRawForm is a bit broken and we have to do this // ourselves... some simple heuristic here.. if (header.toLower() == "set-cookie") { QList<QNetworkCookie> cookies = QNetworkCookie::parseCookies(rawHeader(header)); foreach (QNetworkCookie cookie, cookies) { httpHeader += "set-cookie: " + cookie.toRawForm() + "\r\n"; } } else { httpHeader += header + ": " + rawHeader(header) + "\r\n"; } } httpHeader += "content-length: " + QByteArray::number(m_data.size()) + "\r\n"; httpHeader += "\r\n"; if(m_reply->error() != QNetworkReply::NoError) { qWarning() << "\tError with: " << this << url() << error(); return; } const QByteArray origUrl = m_reply->url().toEncoded(); const QByteArray strippedUrl = m_reply->url().toEncoded(QUrl::RemoveFragment | QUrl::RemoveQuery); interceptResource(origUrl, m_data, httpHeader, operation(), attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt()); } void interceptResource(const QByteArray& url, const QByteArray& data, const QByteArray& header, int operation, int response) { Q_UNUSED(header); Q_UNUSED(url); Q_UNUSED(operation); Q_UNUSED(response); emit resourceIntercepted(data); } private: QNetworkReply* m_reply; QByteArray m_data; QByteArray m_buffer; }; 


рдореБрдЭреЗ рддреБрд░рдВрдд рдХрд╣рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдореИрдВ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдКрдкрд░ рдмрддрд╛рдИ рдЧрдИ рд▓рд╛рдЗрдиреЛрдВ рдХреА рд╢реБрджреНрдзрддрд╛ рдХреЗ рд▓рд┐рдП рдЬрд╡рд╛рдм рдирд╣реАрдВ рджреЗ рд╕рдХрддрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдмрд╛рдд рдХрд╛рдо рдХрд░рддреА рд╣реИ, рдФрд░ рдпрд╣ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд рд╣реИред рдХрд┐рд╕реА рднреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдЗрд╕ рдкреНрд░реЙрдХреНрд╕реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рд╕реБрд░рдХреНрд╖рд╛ рдХреЗрд╡рд▓ рдЖрдкрдХреЗ рдХрдВрдзреЛрдВ рдкрд░ рд╣реИред

рдирд┐рд╖реНрдХрд░реНрд╖


рдореИрдВрдиреЗ рдПрдХ рдХрдорд░реНрд╢рд┐рдпрд▓ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдкрд░ рдпрд╣ рд╕рдм рд╕рд╛рдорд╛рди рдЪреЗрдХ рдХрд┐рдпрд╛ - рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рдХрд┐рд╕реА рдХреЗ рд╕рд╛рде рдХреБрдЫ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИред

рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж
рдирд╛рдо рд╕реНрдерд╛рди

UPD: рдореИрдВрдиреЗ рдШрдЯрдирд╛рдХреНрд░рдо рдХреЛ github - github.com/tucnak/qtwebkit-ri , bon рдРрдкреЗрдЯрд┐рдЯ рдкрд░ рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рд╣реИред

Source: https://habr.com/ru/post/In191476/


All Articles