QObject:无法为位于不同线程中的父级创建子级

时间:2010-07-16 19:08:06

标签: c++ qt

我在Windows 7旗舰版下使用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()));
}

每当在_net_acc_mgr.post()中执行ResultThread::run()时,我在Qt Creator中获得了以下应用程序输出:

  

QObject:无法为位于不同线程中的父级创建子级。

     

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

这是什么意思?怎么解决?

1 个答案:

答案 0 :(得分:55)

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

当您使用多个线程时, Qt 会一直发生这种不同的线程问题。解决此问题的规范方法是使用信号插槽

QNetworkRequestManager所属的对象中创建广告位,在 ResultThread 中创建信号并连接两个地方, ResultThread 的构造函数将是个好地方。

当前位于 ResultThread :: run()的代码将转到新的广告位,并被emit(yourSignal())替换。如果需要,使用您的emit函数发送指向 ResultThread 的指针作为参数,以获取对成员函数/变量的访问权。