QTimer只能用于使用QThread启动的线程

Cou*_*phy 12 post qt multithreading

所以我有一个有趣的问题....我正在尝试编写的程序崩溃了这个错误:

QObject::startTimer: QTimer can only be used with threads started with QThread 
Run Code Online (Sandbox Code Playgroud)

困扰我的是我的程序是单线程的.有问题的类的目标是将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
Run Code Online (Sandbox Code Playgroud)

#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;

}
Run Code Online (Sandbox Code Playgroud)

我认为我想要做的事情相当简单,但令我感到沮丧的是,我无法试图让它发挥作用.我没有在文档中看到有关QNetworkAccessManager需要线程的任何内容.我承认我不太了解Qt,所以任何帮助(或完成POST示例的链接)都将非常感激.

Tro*_*our 10

要使用QTimer你需要有一个事件循环.QNAM显然使用计时器来定期检查网络回复.

您需要启动应用程序事件循环,QCoreApplication::exec()然后调用QNAM方法post.

我想你post以前可以打电话exec但是你可能会遇到这个bug.

此外,请注意,直到Qt 4.7 QNAM没有使用线程,但4.8使用线程正在改变.