2012-04-01 14 views
1

In meiner Anwendung habe ich Listenansicht. Auswählen ein anderes Element in ihm, löst ein Ereignis:QtWebPage - loadFinished() mehrmals aufgerufen

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("+")); 
    } 
} 

Dies ruft eine andere Schlitz - 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())); 
} 

Und schließlich, wenn die Seite vollständig geladen ist, sollte es loading_finished nennen()

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

Aber zu meiner Überraschung, der Ausgang ist:

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" 

Wie Sie sehen können Jedes Mal, wenn ich die Auswahl ändere, wird eine weitere Instanz (?) von WebFrame erstellt und geladen, oder die Seite wird +1 Zeit pro Schleife geladen. Ich habe die letzten 2 Stunden damit verbracht herauszufinden, wo das Problem liegt und ich sehe nichts.

Antwort

2

Sie sollten Signale nur einmal im Konstruktor an Steckplätze anschließen.

Entgegengesetzt, rufen Sie

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

evety Zeit, die Sie Artikel ändern. Ihre Slots werden also so oft aufgerufen, wie Sie connect genannt haben.

+0

Oh verdammt, ich habe diese Linie komplett vergessen. Hat fast alles ausgerechnet, aber das. >.> So eine Schande. Vielen Dank. ;) –

Verwandte Themen