QWebFrame :: findAllElements()在单独的线程中不起作用

时间:2013-09-08 16:18:12

标签: c++ multithreading qt qt5

我正在尝试解析webPage以获取其上的所有链接。我使用QThreadPool和我自己的类来实现QRunnable,它提供了所有功能。一切顺利,如果我在主线程中运行这样的QRunnable,但是当我将我的Runnable放到线程池中时,QWebFrame :: findAllElements(“a”)返回空集。 =(

我运行Runnable: 在同一个线程中,findAllElements()工作正常

webLoader()->run();

findAllElements()返回空set =(

threadPool->start(webLoader);

我已经花了很多时间试图解决问题。 =(

以下是我的代码段:

webloader.h

class WebLoader : public QObject, public QRunnable
{
    Q_OBJECT
    QUrl url;
    QString textPattern;
    QWebPage* page;
public:
    explicit WebLoader(const QUrl& url, const QString& textPattern);
    void run();
    virtual ~WebLoader();
signals:
    void loaded(QList<QUrl> urls, bool error, bool found);
private slots:
    void loadFinished(bool success);
};


webloader.cpp

WebLoader::WebLoader(const QUrl& url, const QString& textPattern): url(url),     textPattern(textPattern) {
    setAutoDelete(false);
}

void WebLoader::run() {
    QEventLoop loop;

    page = new QWebPage;
    page->mainFrame()->load(url);

    connect(page->mainFrame(), SIGNAL(loadFinished(bool)), SLOT(loadFinished(bool)));
    connect(page->mainFrame(), SIGNAL(loadFinished(bool)), &loop, SLOT(quit()));

    loop.exec(); 
}

void WebLoader::loadFinished(bool success) {
    QList<QUrl> urlList;
    bool found = false;

    if(success) {
        QWebElementCollection collection = page->mainFrame()->findAllElements("a");

        foreach(QWebElement element, collection) {
            if(element.hasAttribute("href")) {
                urlList.push_back(url.resolved(QUrl(element.attribute("href"))));
            }
        }

        found = page->findText(textPattern);
    }

    emit loaded(urlList, !success, found);
}

PS。对不起我的英文。

0 个答案:

没有答案