2015-07-30 8 views
0

В настоящее время я работаю над программным обеспечением, которое будет запрашивать сборщик.magic.com для создания базы данных карт. Во время тестирования моих функций я обнаружил, что получаю странные результаты. Мои функции заключаются в следующем:Веб-скребок с QWebView и QWebElement возвращает увеличивающиеся множители

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 

Прежде чем я добавил цикл событий, я бы просто получить имя я карты я раз теперь, кажется, матч на основе какое число в цикле оно.

ответ

2

Следующая строка кода добавляется в конце для цикла фиксируется мой вопрос:

QObject::disconnect(view, SIGNAL(loadFinished(bool)), this, SLOT(saveFile())); 

Я считаю, что это произошло потому, что на каждой итерации цикла я бы подключить новую комбинацию сигналов/слотов, так что каждый произойдет, когда пройдет сигнал, переданный по нагрузке.

+0

Я был пойман этим раньше - я всегда думаю, было бы неплохо, если бы был тест, чтобы проверить, было ли соединение уже сделано до того, как вы установили соединение. Может быть, есть, и я его еще не нашел. –

+0

Говоря с моим другом, который хорошо знает Qt, он также указал, что я мог бы использовать: 'QObject :: connect (view, SIGNAL (loadFinished (bool)), это, SLOT (saveFile()), Qt: : UniqueConnection); ' Это делает то, что вы спрашивали о Майкле –