所以我有一个有趣的问题....我正在尝试编写的程序崩溃了这个错误:
QObject::startTimer: QTimer can only be used with threads started with QThread
令我困惑的是我的程序是单线程的。有问题的类的目标是将POST数据发送到我在服务器上的php页面。一旦它尝试发送POST,我就会收到该消息。这是我的代码。
#ifndef TRANSMISSIONS_H
#define TRANSMISSIONS_H
#include "name_spawn.h"
#include <QNetworkReply>
#include <QObject>
#include <QNetworkConfigurationManager>
class Transmissions : public QObject
{
Q_OBJECT
public:
Transmissions();
void Send(GeneratedData);
public slots:
void serviceRequestFinished(QNetworkReply*);
signals:
void configurationAdded(const QNetworkConfiguration);
void configurationChanged(const QNetworkConfiguration);
void configurationRemoved(const QNetworkConfiguration);
void onlineStateChanged(bool);
void updateCompleted();
};
#endif // TRANSMISSIONS_H
并且
#include "transmissions.h"
#include "name_spawn.h"
#include <QHttp>
#include <QUrl>
#include <QString>
#include <QNetworkReply>
#include <QNetworkRequest>
#include <iostream>
#include <QNetworkAccessManager>
#include <QNetworkConfigurationManager>
#include <QObject>
using namespace std;
Transmissions::Transmissions()
{
}
void Transmissions::Send(GeneratedData User)
{
cerr<<"transmitting"<<endl;
QUrl serviceUrl = QUrl("http://192.168.1.138/postTest.php");
QByteArray postData;
QString username="user="+User.Email()+"&";
QString Passwd="password="+User.pass();
postData.append(username);
postData.append(Passwd);
QNetworkAccessManager *networkManager = new QNetworkAccessManager(this);
connect(networkManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(serviceRequestFinished(QNetworkReply*)));
networkManager->post(QNetworkRequest(serviceUrl), postData);
}
void Transmissions::serviceRequestFinished(QNetworkReply *reply)
{
//this will do other things once post is working
QString data = reply->readAll();
cerr <<"Data is "<< data.toStdString()<<endl;
}
我认为我想要做的事情相当简单,但令我感到沮丧的是我无法尝试让它发挥作用。我没有在文档中看到有关QNetworkAccessManager需要线程的任何内容。我承认我不太了解Qt,所以任何帮助(或完成POST示例的链接)都将非常感激。
答案 0 :(得分:9)
要使用QTimer
,您需要拥有一个事件循环。 QNAM显然使用计时器来定期检查网络回复。
您需要使用QCoreApplication::exec()
启动应用程序事件循环,然后再调用post
之类的QNAM方法。
我认为您可以在post
之前致电exec
,但您可能会遇到this bug。
另外,请注意,Qt 4.7 QNAM最多不使用线程,但使用4.8 this is changing。
答案 1 :(得分:1)
这可能与在Send方法中创建QNetworkAccessManager有关 - 请尝试使用RAII。
将Transmissions标头中的QNetworkAccessManager定义为类变量,并在ctor中创建一个类实例,然后您就可以从Send线程发布它。
否则我认为它超出了范围。