QtWebPage - loadFinished () вызывается несколько раз - PullRequest
1 голос
/ 01 апреля 2012

В моем приложении у меня есть представление списка.Выбор другого элемента в нем вызывает событие:

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 часа, выясняя, где проблема, и я ничего не вижу.

1 Ответ

2 голосов
/ 01 апреля 2012

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

Напротив, вы вызываете

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

каждый раз, когда вы меняете элемент.Таким образом, ваши слоты вызывают так много раз, как вы назвали connect.

...