标签: qnetworkaccessmanager

QObject:无法为位于不同线程中的父级创建子级

编辑:

我试着做你们在评论中告诉我的事情......:

Citizen * c = new Citizen(this);

QThread thread;
c->moveToThread(&thread);

connect(&thread, SIGNAL(started()), c, SLOT(ProcessActions()));
thread.start();
Run Code Online (Sandbox Code Playgroud)

这会产生更多错误:

QThread: Destroyed while thread is still running
ASSERT failure in QThread::setTerminationEnabled(): "Current thread was not started with QThread.", file c:\ndk_buildrepos\qt-desktop\src\corelib\thread\qthread_win.cpp, line 542
Invalid parameter passed to C runtime function.
Invalid parameter passed to C runtime function.
QObject::killTimers: timers cannot be stopped from another thread
Run Code Online (Sandbox Code Playgroud)

我遇到了这个错误的问题......我已经坚持了2天,无法得到解决方案.

标题:

class Citizen : public QThread
{
Q_OBJECT    
    QNetworkAccessManager * manager;

private slots:
    void onReplyFinished(QNetworkReply* net_reply);

public:
    Citizen(QObject …
Run Code Online (Sandbox Code Playgroud)

c++ qt multithreading asynchronous qnetworkaccessmanager

7
推荐指数
2
解决办法
2万
查看次数

QNetworkReply和301重定向

我有一个webviewer,只希望它只能访问我们的webapps,为了达到这个目的,我已经在我的Qt App中找到了一个php标题.这样可以正常工作但有一个例外,那就是301永久移动状态代码.现代浏览器会自动重定向您,但会在http请求的末尾添加"/".

当输入我们的Web应用程序的URL时,它当前需要尾部斜杠才能检测到标题,但我希望它也能获得该标题,即使它们没有放置斜杠.

这是我当前检索标头的方法:

QNetworkAccessManager *manager = new QNetworkAccessManager(this);
    QNetworkRequest request;
    request.setUrl(url);
    connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(onFinished(QNetworkReply*)));

    request.setRawHeader("User-Agent", "CytoViewer 1.0");
    request.setHeader(QNetworkRequest::ContentTypeHeader,"application/CytoViewer");
    QNetworkReply *reply = manager->get(request);
    reply->ignoreSslErrors();
    QEventLoop loop;

    connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));
    loop.exec();
    qDebug() << "QLoop reply all: " << reply->readAll();
    qDebug() << "QLoop: " << reply->rawHeader("Cyto-Study-Manager");
    if(reply->rawHeader("OurWebApp") == "1"){
        //Header exists?(QEventLoop finish) Set arg[1]"url 'Found prouct: product header'"
        product = reply->rawHeader("Product");
        return true;
    } else {
        //Header doen't exist? Graceful error - not a valid PI product
        return false;
    } …
Run Code Online (Sandbox Code Playgroud)

c++ qt qnetworkaccessmanager

7
推荐指数
2
解决办法
9621
查看次数

QNetworkAccessManager:从串行QIODevice发布http multipart

我正在尝试使用QNetworkAccessManager将http多部分上传到专用服务器.

multipart由描述正在上传的数据的JSON部分组成.

从串行QIODevice读取数据,该QIODevice对数据进行加密.

这是创建multipart请求的代码:

QHttpMultiPart *multiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType);

QHttpPart metaPart;
metaPart.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
metaPart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"metadata\""));
metaPart.setBody(meta.toJson());
multiPart->append(metaPart);

QHttpPart filePart;
filePart.setHeader(QNetworkRequest::ContentTypeHeader, QVariant(fileFormat));
filePart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"file\""));
filePart.setBodyDevice(p_encDevice);
p_encDevice->setParent(multiPart); // we cannot delete the file now, so delete it with the multiPart
multiPart->append(filePart);

QNetworkAccessManager netMgr;
QScopedPointer<QNetworkReply> reply( netMgr.post(request, multiPart) );
multiPart->setParent(reply.data()); // delete the multiPart with the reply
Run Code Online (Sandbox Code Playgroud)

如果p_encDevice是QFile的一个实例,则该文件上传得很好.

如果使用专用加密QIODevice(串行设备),则从我的自定义设备读取所有数据.但是QNetworkAccessManager :: post()没有完成(挂起).

我在QHttpPart的文档中读到:

如果设备是顺序的(例如套接字,但不是文件),则应在设备发出finished()后调用QNetworkAccessManager :: post().

不幸的是我不知道那是怎么回事.

请指教.

编辑:

QIODevice根本没有完成()插槽.更重要的是,如果没有调用QNetworkAccessManager :: post(),那么从我的自定义IODevice读取根本不会发生,因此设备将无法发出这样的事件.(赶上22?)

编辑2:

QNAM似乎根本不适用于顺序设备.请参阅有关qt-project的讨论.

编辑3:

我设法"欺骗"QNAM让它认为它是从非顺序设备读取,但搜索和重置功能阻止搜索.这将有效,直到QNAM真正尝试寻求. …

post qt http qt4 qnetworkaccessmanager

7
推荐指数
1
解决办法
4464
查看次数

QNetworkAccessManager - 第一次GET非常慢

我在Android上的Qt 5.5中使用QNetworkAccessManager时遇到问题.通过http GET下载一个简单的小图形文件会导致很多垃圾收集调用,并在此期间锁定UI.随后的GET可以完美地工作,没有这些GC调用.代码如下:

void DownloadManager::downloadFile(QUrl fromUrl, QString toFilePath) {

    _currentFilePath = toFilePath;

    QNetworkRequest request;
    request.setUrl(fromUrl);

    qDebug() << "before";

    _currentReply = _mgr.get(request);

    qDebug() << "after";

    connect(_currentReply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(downloadError(QNetworkReply::NetworkError)));
    connect(_currentReply, SIGNAL(downloadProgress(qint64, qint64)), this, SLOT(downloadProgress(qint64,qint64)));
    connect(_currentReply, SIGNAL(finished()), this, SLOT(downloadFinished()));

}
Run Code Online (Sandbox Code Playgroud)

DownloadManager是一个自定义的QObject派生类,没有任何与get请求相关的特殊功能._mgr是在DownloadManagers cTor期间分配的QNetworkAccessManager对象.

正如您所看到的,这只是一个获取请求的教科书示例,没有什么太花哨的.正如我所说:它在大多数情况下都有效.只有第一个get请求最终会像这样:

D/ .../downloadmanager.cpp:61 (void DownloadManager::downloadFile(QUrl, QString)): before
D/dalvikvm(13298): GC_CONCURRENT freed 2290K, 25% free 10911K/14407K, paused 2ms+3ms, total 29ms
D/dalvikvm(13298): GC_CONCURRENT freed 501K, 25% free 10884K/14407K, paused 13ms+2ms, total 35ms
D/dalvikvm(13298): GC_CONCURRENT freed 524K, 25% free 10892K/14407K, paused …
Run Code Online (Sandbox Code Playgroud)

c++ qt android qnetworkaccessmanager

7
推荐指数
1
解决办法
613
查看次数

服务器需要cookie时的QT HTTP Post问题

我一整天都在努力,没有成功.请帮助解决问题.在谷歌搜索我发现很多用户有这个问题,但我无处可寻找解决方案.

我正在尝试在QT C++中做HTTP帖子我已经尝试在python中做这个(我的问题不是python问题,所以Qt专业人士请帮助)..我知道,我在处理cookie和所有方面都有问题,所以请帮忙.请提供可能的解决方案.

在python中,代码简洁明了.我已经删除了错误处理和所有额外的事情以使其变得简单.

url = 'http://www.example.com/'
data = 'username=abc&password=passwd'
cj = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
usock = opener.open(url, data)
#>>>>>> NOW, I have the cookiejar <<<<<<<<<

opener.addheaders = [('Referer','http://www.example.com/xyz.php'),('User-Agent','Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.3) Gecko/20091020 Ubuntu/9.10 (karmic) Firefox/3.5.3 GTB7.0')]
data_to_send = 'ABCDEFGH'
url_send = "http://www.example.com/xyz.php"
send = opener.open(url_send,data_to_send)
Run Code Online (Sandbox Code Playgroud)

我做的QT等效: -

void SmsSender::sendToMyCantos()
{
    manager = new QNetworkAccessManager(this);
    manager->setCookieJar(new QNetworkCookieJar(manager));
    connect(manager,SIGNAL(finished(QNetworkReply*)),this,SLOT(replyFinished(QNetworkReply*)));
    request.setUrl(QUrl("http://www.mycantos.com"));
    postData.append("username=abc&password=passwd");
    manager->post(request,postData);
    //>>>>>> So, I feel that I have CookieJar now to make POST <<<<<<< …
Run Code Online (Sandbox Code Playgroud)

c++ cookies qt qt4 qnetworkaccessmanager

6
推荐指数
1
解决办法
9875
查看次数

中止回复因访问冲突而崩溃

我有一个很大的问题,我实际上认为我已经解决了它。我有一个使用 QNetworkAccessManager 的应用程序。这个QNAM位于一个类中。当我在此 QNAM 上执行请求时,所有请求都在一个包装器中完成,该包装器保存回复并对其执行重试逻辑

例如,如果我在构造函数中有一个 putBlob(继承自 baseRequest),我会传递对 QNAM 的引用。我在其上执行请求并保存指向回复的指针。然后回复将是包装器子项,因此 QNAM 不再拥有它的所有权。包装器是保存 QNAM 的原始类的子类。

类有一个 QNAM,以及子级“putBlobRequest”,其子级有“QNetworkReply*”

现在的问题是,当用户想要取消时,应该删除主对象及其中的所有内容。包装器还应该中止其 QNetworkReply 并断开连接(以便它不会调用 finish())

我的 baseRequest 析构函数(它保存 QNetworkReply 并且是它的父级)看起来像这样:

if(_reply) {
    if(_reply->isRunning()) {
        _reply->disconnect(SIGNAL(finished()));
        _reply->disconnect(SIGNAL(uploadProgress(qint64, qint64)));
        _reply->abort();
    }
}
Run Code Online (Sandbox Code Playgroud)

当包装器在保存它的类中被杀死时,删除就完成了。(对吗?)

这有时有效,但有时我会遇到巨大的访问冲突,并且所有内容都会因以下调用堆栈而崩溃:

QtCored4.dll!QObject::disconnect(const QObject * sender, const char * signal, const QObject * receiver, const char * method)  Line 2891 + 0x8 bytes C++
QtNetworkd4.dll!QNetworkReplyImpl::abort()  Line 874 + 0x18 bytes   C++
FrameworkAzure.dll!BaseRequest::~BaseRequest()  Line 129 + 0xa bytes    C++
FrameworkAzure.dll!PutBlobRequest::~PutBlobRequest()  Line 24 + 0x5e bytes  C++ …
Run Code Online (Sandbox Code Playgroud)

c++ qt access-violation qnetworkaccessmanager

6
推荐指数
1
解决办法
1844
查看次数

如何在不同的类中使用QNetworkAccessManager?课程之间的重要数据的一般共享?

我有一个MainWindow应用程序,我正在努力学习C++和Qt(C++和QT 4.8).我想在我的应用程序的不同对象中执行HTTP请求,例如Dialogs/Wizard和MainWindow.我知道我基本上应该为每个应用程序配备一个QNetworkAccessManager.我的问题是,在课间通过这个QNAM的正确方法是什么?

目前我将它作为指针传递给我的向导的构造函数,但这似乎......不优雅且不灵活.给我的Dialogs或我决定做的其他任何类的正确方法是什么,访问我的一个QNetworkAccessManager?我想我对提供所有访问权限所需的任何数据都有同样的问题.

什么是正确的C++设计解决方案?单身模式似乎是一种选择,但据我所知,这是一个糟糕的模式.我在这里有一些代码来展示我的问题.

我的MainWindow构造函数和插槽启动我的向导:

MyMainWindow::MyMainWindow
{
    qnam = new QNetworkAccessManager();
}

...

MyMainWindow::wizardStarter
{
    mywizard = MyWizard(vari, qnam, this);
}
Run Code Online (Sandbox Code Playgroud)

我的向导构造函数,我在从用户获取数据后进行网络请求和解析数据,因此我需要一个QNetworkAccessManager:

MyWizard::MyWizard(SomeOtherArgument *vari, QNetworkAccessManager *qnam, QObject *parent)
{
    ...
    this->ourQnam = qnam;
    ...
}

MyWizard::launchRequest(QUrl newUrl)
{
    ourQnam->get(QNetworkRequest(newUrl));
}
Run Code Online (Sandbox Code Playgroud)

c++ oop qt qnetworkaccessmanager

6
推荐指数
1
解决办法
1358
查看次数

Qt信号槽连接-QNetworkAccessManager

我是 Qt 新手,我试图理解以下信号槽连接:

m_networkManager = new QNetworkAccessManager(this);
QNetworkReply *reply = m_networkManager->get(request);
connect(reply, SIGNAL(finished()),this, SLOT(onRequestCompleted()));
Run Code Online (Sandbox Code Playgroud)

为什么我们在 get-request 之后连接“finished”信号?...如果第 2 行中的网络连接在插槽连接(第 3 行)之前执行得更快,会发生什么?

我知道,这段代码会起作用。但我想了解这是怎么可能的:)

qt signals qnetworkaccessmanager slot

5
推荐指数
1
解决办法
1300
查看次数

Qttt中没有QHttp

我注意到QHttpQt5中不再提供该类,我不断收到一条错误消息,说我需要使用它QNetworkAccessManager来执行此操作.

有没有办法在Qt5中访问这个类?

c++ qt qnetworkaccessmanager qt5 qhttp

5
推荐指数
2
解决办法
8272
查看次数

有没有办法获取有关 QNetworkAccessManager 队列的信息?

来自Qt 4 文档

注意:QNetworkAccessManager将收到的请求排队。

现在,我希望能够做两件事(使用 PyQt):

  1. 检查“内部”队列中有多少请求QNetworkAccessManager等待发送。
  2. 检查有多少请求已收到答案(即计算已完成的 QNetworkReplies 的数量)。

我认为这些信息一定已经可供内部使用QNetworkAccessManager,但我还没有找到访问它的方法。我在 Qt 文档或其他地方找不到任何内容,但也许我找错了地方或使用了错误的术语。

有人可以告诉我 Qt 是否提供某种方式来访问有关QNetworkAccessManager队列的信息吗?

只是为了清楚起见:我可以想出几种方法来自己跟踪这些事情,例如通过检查各个 QNetworkReply 状态,但这不是我正在寻找的解决方案(仅作为最后的手段,如果 Qt 不提供更简单的方法)。

- - 编辑 - -

一个稍微比最小但仍然微不足道的例子来说明我想到的这种事情:

import sys
import json
from PyQt4 import QtNetwork, QtGui, QtCore

def show_reply_content(reply):
    print 'url from reply content: {}'.format(
        json.loads(str(reply.readAll()))['url'])

    # Quit if all replies are finished
    reply.deleteLater()
    reply.manager().replies_unfinished -= 1
    if not reply.manager().replies_unfinished:
    app.quit()

# Some initialization
app = QtGui.QApplication(sys.argv)
manager …
Run Code Online (Sandbox Code Playgroud)

queue qt pyqt pyside qnetworkaccessmanager

5
推荐指数
1
解决办法
1150
查看次数