编辑:
我试着做你们在评论中告诉我的事情......:
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) 我有一个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) 我正在尝试使用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()没有完成(挂起).
如果设备是顺序的(例如套接字,但不是文件),则应在设备发出finished()后调用QNetworkAccessManager :: post().
不幸的是我不知道那是怎么回事.
请指教.
编辑:
QIODevice根本没有完成()插槽.更重要的是,如果没有调用QNetworkAccessManager :: post(),那么从我的自定义IODevice读取根本不会发生,因此设备将无法发出这样的事件.(赶上22?)
编辑2:
QNAM似乎根本不适用于顺序设备.请参阅有关qt-project的讨论.
编辑3:
我设法"欺骗"QNAM让它认为它是从非顺序设备读取,但搜索和重置功能阻止搜索.这将有效,直到QNAM真正尝试寻求. …
我在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) 我一整天都在努力,没有成功.请帮助解决问题.在谷歌搜索我发现很多用户有这个问题,但我无处可寻找解决方案.
我正在尝试在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) 我有一个很大的问题,我实际上认为我已经解决了它。我有一个使用 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) 我有一个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) 我是 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 行)之前执行得更快,会发生什么?
我知道,这段代码会起作用。但我想了解这是怎么可能的:)
我注意到QHttpQt5中不再提供该类,我不断收到一条错误消息,说我需要使用它QNetworkAccessManager来执行此操作.
有没有办法在Qt5中访问这个类?
来自Qt 4 文档:
注意:
QNetworkAccessManager将收到的请求排队。
现在,我希望能够做两件事(使用 PyQt):
QNetworkAccessManager等待发送。我认为这些信息一定已经可供内部使用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)