我正在尝试解析 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。对不起我的英语不好。