2012-04-01 3 views
1

В моем приложении у меня есть просмотр списка. При выборе другого элемента в нем, вызывает событие:QtWebPage - loadFinished(), вызываемый несколько раз

connect(listView->selectionModel(), SIGNAL(currentChanged(const QModelIndex &, const QModelIndex &)), this, SLOT(item_changed(const QModelIndex &, const QModelIndex &))); 

void MainWindow::item_changed(const QModelIndex & current, const QModelIndex & previous) 
{ 
    qDebug() << "\n" << "item_changed(), caller: " << sender()->objectName(); 
    if (current.isValid()) 
    { 
     /* 
      not so important code 
     */ 

     change_query(tokens.join("+")); 
    } 
} 

Это вызывает еще один слот - change_query().

void MainWindow::change_query(QString newquery) 
{ 
    qDebug() << "change_query(), caller: " << sender()->objectName(); 

    QUrl query (newquery); 

    frame->load(query); 

    connect(frame, SIGNAL(loadFinished(bool)), this, SLOT(loading_finished())); 
} 

И, наконец, когда страница полностью загружена, то он должен вызывать loading_finished()

void MainWindow::loading_finished() 
{ 
    qDebug() << "loading_finished(), caller: " << sender()->objectName(); 
} 

Но, к моему удивлению, выход:

item_changed(), caller: "SelectionModel" 
change_query(), caller: "SelectionModel" 
loading_finished(), caller: "frame" 

item_changed(), caller: "SelectionModel" 
change_query(), caller: "SelectionModel" 
loading_finished(), caller: "frame" 
loading_finished(), caller: "frame" 

item_changed(), caller: "SelectionModel" 
change_query(), caller: "SelectionModel" 
loading_finished(), caller: "frame" 
loading_finished(), caller: "frame" 
loading_finished(), caller: "frame" 

item_changed(), caller: "SelectionModel" 
change_query(), caller: "SelectionModel" 
loading_finished(), caller: "frame" 
loading_finished(), caller: "frame" 
loading_finished(), caller: "frame" 
loading_finished(), caller: "frame" 

Как вы можете видеть , каждый раз, когда я меняю выбор, создается и загружается другой экземпляр (?) WebFrame, или страница загружается +1 раз каждый цикл. Я провел последние 2 часа, выясняя, где проблема, и ничего не вижу.

ответ

2

Вы должны подключать сигналы к слотам только один раз, возможно в конструкторе.

Противно, вы звоните

connect(frame, SIGNAL(loadFinished(bool)), this, SLOT(loading_finished())); 

время evety вы измените пункт. Таким образом, ваши слоты вызываются так много раз, как вы назвали connect.

+0

О, черт побери, я совсем забыл об этой линии. Прокомментировал почти все, но это. >.> Такой позор. Большое спасибо. ;) –

Смежные вопросы