Как изменить данные POST в qtwebkit?

Для изменения переменных POST в qtwebkit необходимо изменить или заменить исходящие данные в createRequest(...). Как создать свой <PyQt4.QtCore.QIODevice object at 0x03BA...> не QFile или QByteArray. Точно объект QIODevice! Это необходимо для создания записываемого устройства. Или как преобразовать <PyQt4.QtCore.QBuffer object at 0x03BA...> в <PyQt4.QtCore.QIODevice object at 0x03BA...>.
Это устройство чаще всего используется в QNetworkAccessManager:
https://qt.gitorious.org/qt/webkit/source/7647fdaf9a4b526581e02fbd0e87c41a96cbfebb:src/network/access/qnetworkaccessmanager.cpp#L941

QNetworkReply *QNetworkAccessManager::createRequest(QNetworkAccessManager::Operation op,
const QNetworkRequest &req,
QIODevice *outgoingData)
...

ОБНОВЛЕНИЕ: после вызова этого метода:

def createRequest(manager, operation, request, data):
    if data.size() > 0:
        post_body = "q=hello"
        output = QtCore.QByteArray()
        buffer = QtCore.QBuffer(output)
        buffer.open(QtCore.QIODevice.ReadWrite)
        buffer.writeData(post_body)
        data = buffer

    reply = QNetworkAccessManager.createRequest(manager, operation, request, data)
    return reply

скрипт зависает...


person user3446100    schedule 29.10.2014    source источник
comment
Как будет сказано в документации, QIODevice является абстрактным классом, т. е. предполагается, что вы должны создавать его подклассы и самостоятельно реализовывать различные методы, а не создавать его экземпляры напрямую.   -  person mdurant    schedule 29.10.2014


Ответы (2)


Если я понимаю ваш вопрос, A QBuffer уже является реализацией (абстрактного, как отметил @mdurant) класса QIODevice. Так, например (я пробовал это на PySide, но я считаю, что PyQt должен быть таким же):

>>> from PySide.QtCore import QIODevice, QBuffer, QByteArray
>>> buff = QBuffer(QByteArray())
>>> isinstance(buff, QIODevice)
True

Чтобы создать запись QIODevice с возможностью записи в QByteArray, вы можете сделать примерно следующее:

ba = QByteArray()
buff = QBuffer(ba)
buff.open(QIODevice.WriteOnly)

Теперь вы можете писать в buff, как если бы это был QIODevice, и тогда данные будут доступны в ba.

person shevron    schedule 29.10.2014
comment
ba = QByteArray() buff = QBuffer(ba) buff.open(QIODevice.WriteOnly) print buff печать: <PyQt4.QtCore.QBuffer object at 0x01ADAE40> not<PyQt4.QtCore.QIOdevice object at...> - person user3446100; 29.10.2014
comment
извините, я обновляю свой вопрос, хорошо в ba ‹class 'PyQt4.QtCore.QIODevice'›, но это устройство не работает в createRequest(QNetworkAccessManager::Operation op, const QNetworkRequest &req, QIODevice *outgoingData) - person user3446100; 29.10.2014
comment
Что вы имеете в виду под не работать? Вы получаете сообщение об ошибке? BTW поможет, если вы сядете на примеры кода Python (а не на смесь C++/Python); также нет необходимости вставлять строку класса __repr__ — было бы намного читабельнее, если бы вы просто написали QBuffer или PyQt4.QtCore.QBuffer вместо этих ужасных строк <PyQt4.QtCore.QBuffer object at 0x01ADAE40>. - person shevron; 30.10.2014
comment
Я снова обновляю свой вопрос! После вызова метода - createRequest(manager, operation, request, data) с QBuffer в data скрипт зависает... - person user3446100; 30.10.2014

В основном вы были близки, интересно, почему вы не получили ошибку сегментации, это случалось со мной каждый раз, когда я не устанавливал родительский объект нового объекта данных:

def createRequest(manager, operation, request, data):
    if data.size() > 0:
        data = QBuffer(QByteArray("q=hello"))
        # data was originally a ReadOnly device as well, keep it that way
        data.open(QIODevice.ReadOnly)

    reply = QNetworkAccessManager.createRequest(manager, operation, request, data)
    # must explicitly set the parent of the newly created data object to this reply object. 
    data.setParent(reply)

    return reply

Я написал именно об этой проблеме здесь: https://github.com/integricho/path-of-a-pyqter/tree/master/qttut07

person andrean    schedule 31.10.2014