QtWebPage - 多次调用loadFinished()

时间:2012-04-01 17:16:18

标签: c++ qt qtwebkit

在我的应用程序中,我有列表视图。选择其中的其他项目会触发一个事件:

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实例(?),或者每个循环加载一次页面。我花了最近2个小时找出问题所在,我什么也没看到。

1 个答案:

答案 0 :(得分:2)

您应该只在插槽中将信号连接到插槽一次。

相反,你打电话

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

你改变项目的时间过长了。因此,您调用connect时会多次调用您的广告位。