Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > [Qt] собственный QNetworkReply


Автор: XeS 23.2.2010, 17:12
Собственно использую QWebKit для вывода сгенерированного программой html текста, весь контент для странички содержится в zip архивах поэтому использую ссылки вида: <img src="zip://pack_12.zip/1.jpg">, т.е мне надо реализовать обработчик для таких ссылок, я переопределил 

Код

QNetworkAccessManager.createRequest (Operation, QNetworkRequest, QIODevice device = None)


Создал свой 

Код

class MyNetworkReply : public QNetworkReply


переопределил в нем все виртуальные методы от QIODevice и QNetworkReply.

Устанавливаю Header Для картинки (image/jpeg), url (zip://pack_12.zip/1.jpg), QNetworkRequest.

Возвращаю экземпляр из функции QNetworkAccessManager.createRequest.

В итоге QWebKit не чего не загружает, единственную функцию которую вызывает QWebKit  это QNetworkReply::url().


Кто нибуть переопределял класс QNetworkReply на свой, поделитесь опытом пожалуйста.

Автор: SABROG 23.2.2010, 17:35
Эту http://doc.trolltech.com/qq/32/qq32-webkit-protocols.html читал?

Автор: XeS 23.2.2010, 23:56
Да читал, не выходит у меня этот класс переопределить. Я переопределил для теста вообще все функции класса. Кроме QNetworkReply::url(), не вызывается больше не какая функция после возвращения его из QNetworkAccessManager, я так понял по документации что нужно отправить сигнал readyRead когда класс будет готов отправить данные. Можно ли в классе как-нибудь узнать, что к сигналу readyRead привязали какой-нибудь слот?

p/s: кьют начал использовать недавно меньше месяца, многое не знаю)) пните хотябы в какую сторону копать.

Добавлено через 3 минуты и 14 секунд
Код

QNetworkReply* MyNetworkAccessManager::createRequest(Operation op, const QNetworkRequest& req, QIODevice* outgoingData)
{
    MyNetworkReply* networkReply = new MyNetworkReply(this);
    networkReply->setConfig(req.url(), op, req);

    return networkReply;
}


Код

MyNetworkReply::MyNetworkReply(QObject* parent) : QNetworkReply(parent)
{
    urlToFile(m_FilePath, m_Header, this->url().toString().toStdString());

    m_file = new QFile(m_FilePath.c_str());

    open(QIODevice::ReadOnly);

    this->setHeader(QNetworkRequest::ContentTypeHeader, QVariant(m_Header.c_str()));
    
    this->setHeader(QNetworkRequest::ContentLengthHeader, QVariant(m_file->size()));
}

MyNetworkReply::~MyNetworkReply()
{
    this->close();
}

void MyNetworkReply::abort()
{

}

void MyNetworkReply::setConfig(const QUrl& turl, QNetworkAccessManager::Operation op, const QNetworkRequest& req)
{
    this->setUrl(url);
    this->setOperation(op);
    this->setRequest(req);
}

qint64 MyNetworkReply::readData(char* data, qint64 maxSize)
{
    return m_file->read(data, maxSize);
}

qint64 MyNetworkReply::bytesAvailable() const
{
    return m_file->size();
}

bool MyNetworkReply::isSequential() const
{
    return true;
}

bool MyNetworkReply::open(OpenMode open)
{
    QIODevice::setOpenMode(open);
    return m_file->open(open);
}

Автор: XeS 28.2.2010, 18:14
up :(

Автор: SABROG 28.2.2010, 20:40
Если знаешь английский, то лучше спроси на qtcentre.org иначе на prog.org.ru
Вопрос довольно сложный, но не нерешаемый. У меня нет опыта наследования QNAM и создания собственных QNetworkReply.

Проверь вызывается ли какая-либо функция из примера http://doc.trolltech.com/qq/32/examples/qq32-webkit-protocols.zip, если да, то посмотри в чем разница.

Автор: IrbisDev 3.3.2010, 00:13
Цитата

Можно ли в классе как-нибудь узнать, что к сигналу readyRead привязали какой-нибудь слот?

С помощью QSignalSpy в приложении можно посмотреть, когда и какие сигналы испускает объект.
qthelp://com.trolltech.qt.460/qdoc/qsignalspy.html#details

если слот не привязан, то в консоли приложения IDE появляется сообщение Object::connect: No such slot YourClass::YourSlot(YourType);

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)