错误方法:直接继承QThread类,在QThread类中实现run方法进行网络操作。
正确方法:1. 创建QObject子类(Handler),创建工作函数(如run方法),在run方法中实现网络操作。
2. 在主线程中创建QThread对象(QThread *t = new QThread(this)),然后创建处理对象(Handler hander), 然后hander.moveToThread(t), 连接信号到hander.run(),线程start(),发送信号。
代码如下:
test.h文件:
class Handler: public QObject
{
Q_OBJECT
public:
Handler(QNetworkAccessManager *pManager) : pManager(pManager){}
public slots:
void run(){
//todo: 创建请求对象req
//QNetworkRequest req(QUrl("..."));
//pManager->post(...);
}
private:
QNetworkAccessManager *pManager;
};
class test : public QWidget
{
Q_OBJECT
public:
test(QWidget *parent = 0, Qt::WFlags flags = 0);
~test();
signals:
void start();
private:
};
test.cpp文件:
#include "test.h"
test::test(QWidget *parent, Qt::WFlags flags)
: QWidget(parent, flags)
{
QNetworkAccessManager *p = new QNetworkAccessManager(this);
Handler handler(p);
QThread *pThread = new QThread(this);
handler.moveToThread(pThread);
connect(this, SIGNAL(start()), &handler, SLOT(run()));
pThread->start();
emit start();
}
test::~test()
{
}
main.cpp文件:
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
test w;
w.show();
return a.exec();
}