В настоящее время я работаю над программным обеспечением, которое будет запрашивать gatherer.magic.com для создания базы данных карт. При тестировании своих функций я обнаружил, что получаю странные результаты. Мои функции следующие:
void cardDB::updateDB()
{
this->view = new QWebView;
QString urlString("http://gatherer.wizards.com/Pages/Card/Details.aspx? multiverseid=");
for(int i = 1; i <= 4; i++)
{
// Load the page
view->load(QUrl(urlString+QString::number(i)));
QObject::connect(view, SIGNAL(loadFinished(bool)), this, SLOT(saveFile()));
// Wait for saveFile() to finish
QEventLoop loop;
QObject::connect(this, SIGNAL(done()), &loop, SLOT(quit()));
loop.exec();
}
}
void cardDB::saveFile()
{
QString fileName("test");
// Grab the name tag
QWebElement e = view->page()->mainFrame()->findFirstElement("div#ctl00_ctl00_ctl00_MainContent_SubContent_SubContent_nameRow");
QString pageString = e.toPlainText();
pageString.remove(0, 11);
QFile localFile(fileName +".txt");
if (!localFile.open(QIODevice::Append))
{
// Still need to implement error catching
}
else
{
localFile.write(pageString.toUtf8());
localFile.close();
}
emit done();
}
мои результаты получаются так:
Ankh of Mishra
Basalt Monolith
Basalt Monolith
Black Lotus
Black Lotus
Black Lotus
Black Vise
Black Vise
Black Vise
Black Vise
До того, как я добавил цикл обработки событий, я просто получал бы имя i-карты, и теперь оно кажется совпадающим в зависимости от того, какой это номер в цикле.
Следующая строка кода, добавленная в конце цикла for, исправила мою проблему:
QObject::disconnect(view, SIGNAL(loadFinished(bool)), this, SLOT(saveFile()));
Я полагаю, что это произошло потому, что на каждой итерации цикла я подключал новую комбинацию сигнал / слот, чтобы каждая происходила при прохождении сигнала loadFinished.