2014-10-29 26 views
0

对于更改qtwebkit中的POST变量需要更改或将createData中的outgoingData替换为(...)。 如何创建自己的<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如何更改qtwebkit中的POST数据?

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

UPDATE:调用此方法后:

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 

脚本挂断......

+1

正如文档会告诉你,QIODevice是一个抽象类,也就是说,你应该继承它并自己实现各种方法,而不是直接实例化它。 – mdurant 2014-10-29 13:37:41

回答

0

如果我做的意义你的问题,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中可用。

+0

BA = QByteArray中() 抛光轮= Q缓冲器(BA) buff.open(QIODevice.WriteOnly) 打印抛光轮 印刷是:'<在0x01ADAE40 PyQt4.QtCore.QBuffer对象>'not' ' – user3446100 2014-10-29 13:56:16

+0

对不起,我更新了我的问题,在ba 中可以,但是此设备在'createRequest(QNetworkAccessManager :: Operation op, const QNetworkRequest&req, QIODevice * outgoingData)' – user3446100 2014-10-29 14:36:05

+1

“不工作”是什么意思?你是否收到错误信息?顺便说一句,如果你坐在Python代码示例(而不是C++/Python混合);也不需要粘贴类'__repr__'字符串 - 如果你只写了'QBuffer'或'PyQt4.QtCore.QBuffer'而不是那些可怕的 '串。 – shevron 2014-10-29 21:44:10

0

基本上你靠近,我不知道为什么你没有得到一个分段错误,它发生在我身上,每次当我没设置新的数据对象的父对象:

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