C++ QT: alte connects beenden?

T_55

Lieutenant
Registriert
Feb. 2013
Beiträge
638
Hallo,

ich hab einen Signal-Slot welcher das Anklicken des TabellenHeaders/Spaltenbezeichnung erkennen soll um dann eine Funktion aufzurufen. Im Programm wird die Tabelle immer mal wieder neu erstellt und dies führt dazu, dass scheinbar die alten connections erhalten bleiben und bei jedem neuen anzeigen der Tabelle das Signal so zu einer Mehrfachausführung der Funktion führt.
C++:
void MainWindow::HeaderClicked(int logicalIndex)
{
     QDebug << "HeaderClicked";
}

// beim Aktualisieren der Tabelle:
ui->tableWidget->clear();
ui->tableWidget->disconnect(); // test um alte connections zu beenden, geht aber nicht.

// erstelle neue aktuelle tableWidget Inhalte... (Code zur Verkürzung hier ausgelassen)

// Und danach signal-slot erstellen:
QHeaderView *header = qobject_cast<QTableView *>(ui->tableWidget)->horizontalHeader();
connect(header, &QHeaderView::sectionClicked, [this](int logicalIndex){HeaderClicked(logicalIndex);});

Die Funktion soll natürlich bei einem Klick nur 1x aufgerufen werden aber sie wird bei einem Klick so oft aufgerufen wie die Tabelle aktualisiert wurde. Wurde die Tabelle zB 5x aktualisiert dann wird bei einem Klick auf den SpaltenHeader die Funktion 5x aufgerufen. Daher meine Schlussfolgerung, die alten/vorigen connects bleiben weiter aktiv. Daher die Frage wie kann ich die alten connects löschen/beenden bevor ich die Tabelle neu aktualisiere? Ich habe es mit ui->tableWidget->disconnect(); versucht dies hat aber keine Wirkung. Hat jemand eine Idee?

Gruß
 
Zuletzt bearbeitet:
Kann man einen signal+slot machen, der permanent aktiv ist unabhängig davon, welcher Bereich angeklickt wurde?
Dann könntest du im slot entsprechend reagieren anstatt pro index ne eigene Signal-Slot beziehung zu pflegen.
 
  • Gefällt mir
Reaktionen: T_55
Warum erstellst du die Connection immer wieder neu? Ändert sich die Anzahl der Header? Wenn nicht, warum benutzt du dann nicht clearContents(), anstatt clear()?
Ergänzung ()

Disconnect habe ich nie benutzt. Aber wenn du die QHeaderView connectest, dann solltest du diese auch disconnecten - und nicht das QTableWidget. Kannst ja mal testen, bevor du clear() aufrufst.
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: T_55
Xonical schrieb:
Ändert sich die Anzahl an Headern?
Ja Anzahl von Spalten und Reihen kann jedes mal komplett unterschiedlich sein.
Die Idee nur einmal signal+slot zu machen ist natürlich gut ich checke gerade mal ob das funktioniert mit sich ändernder Spaltenanzahl
Ergänzung ()

Ok danke euch so simpel kann es sein das klappt, einfach signal+slot nur 1x zu Beginn erstellen und unterschiedliche Spaltenanzahl ist im Test kein Problem.
Ergänzung ()

Xonical schrieb:
Aber wenn du die QHeaderView connectest, dann solltest du diese auch disconnecten - und nicht das QTableWidget. Kannst ja mal testen, bevor du clear() aufrufst.
Ja so funktioniert es auch. Aber sauberer ist dann vermutlich einfach das einmalige Erstellen.
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: kuddlmuddl
Stimme den anderen zu, jedes Mal neu connecten ist etwas komisch. Davon ab gibt es aber dennoch die Moeglichkeit eine Signal-Slot-Verbindung zu disconnecten.
 
Zurück
Oben