1

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

我运行我的 Runnable: 在同一个线程中,findAllElements() 完美运行

webLoader()->run();

findAllElements() 返回空集 =(

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。对不起我的英语不好。

4

0 回答 0