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