QObject:不能为不同的线程中的父项创build子项

我在Windows 7旗舰版下使用了Qt Creator 1.3.0和Qt 4.6.0(32位)。 考虑以下QThread:

class ResultThread : public QThread { Q_OBJECT QString _post_data; QNetworkAccessManager _net_acc_mgr; signals: void onFinished(QNetworkReply* net_reply); private slots: void onReplyFinished(QNetworkReply* net_reply); public: ResultThread(); void run(); void setPostData(const QString& post_data); }; 

履行

 ResultThread::ResultThread() : _net_acc_mgr(this) { connect(&_net_acc_mgr, SIGNAL(finished(QNetworkReply*)), this, SLOT(onReplyFinished(QNetworkReply*))); } void ResultThread::onReplyFinished(QNetworkReply* net_reply) { emit onFinished(net_reply); } void ResultThread::setPostData(const QString& post_data) { _post_data = post_data; } void ResultThread::run() { _net_acc_mgr.post(QNetworkRequest(QUrl("http://[omitted]")), QByteArray(_post_data.toStdString().c_str())); } 

每当在ResultThread::run()执行ResultThread::run() ,我在Qt Creator中得到以下应用程序输出:

QObject:不能为不同的线程中的父项创build子项。

(父母是QNetworkAccessManager(0x22fe58),父母的线程是QThread(0x9284190),当前线程是ResultThread(0x22fe48)

这是什么意思? 如何解决? 提前致谢。

run()成员函数在不同的线程中执行,而不是QNetworkRequestManager对象创build的线程。

当你使用multithreading时,这种不同的线程问题总是与Qt一起发生。 解决这个问题的标准方法是使用信号插槽

QNetworkRequestManager所属的对象中创build一个 ,在ResultThread中创build一个信号并连接这两个地方, ResultThread的构造函数将是一个不错的地方。

当前在ResultThread :: run()中的代码将进入新的插槽 ,并由emit(yourSignal())代替。 如果需要,可以使用emit函数发送指向ResultThread的指针作为参数,以访问成员函数/variables。