Seite 1 von 1

Doppeltes connect() verhindern?

Verfasst: 6. Mai 2009 12:23
von CKassiopaia
Hallo!

Kurze Frage: Kann ich vor einem connect() überprüfen, ob die Signal-Slot-Verbindung bereits besteht, dami ich doppelte Aktionen vermeide?

Als Alternative würde ich nach dem connect einfach überprüfen, ob der connect erfolgreich war und dies in einer Variable zwischenspeichern...

Danke!

Verfasst: 6. Mai 2009 12:27
von upsala
Wird überhaupt eine 2. Verbindung angelegt? Ansonsten kannst du ja zuvor ein disconnect ausführen.

Verfasst: 6. Mai 2009 12:40
von CKassiopaia
Ja, es wird eine zweite Verbingung angelegt... also das Dialogfeld, was bei dem SIGNAL kommt, wird zwei mal aufgerufen!

Ist denn ein vorheriges disconnect eine saubere Lösung?

Verfasst: 6. Mai 2009 12:55
von pfid
Mach doch einfach nur einmal connect.

Verfasst: 6. Mai 2009 12:58
von CKassiopaia
Hmmm....ich wollte von mehreren Stellen das Connect ausführen....von daher is das schwierig gewesen, da man nicht wusste, ob der "haken" bereits gesetzt wurde ;-)

Aber ich hab das jetzt auch nur "einmal" connected.

Aber meine Frage ist immer noch nicht beantwortet ... :-)

Verfasst: 6. Mai 2009 13:18
von pfid
Was soll am disconnect denn nicht sauber sein?

Verfasst: 6. Mai 2009 13:24
von franzf
2 Möglichkeiten, die mir gerade einfallen:
1) eigene Methode für connect:

Code: Alles auswählen

bool uniqueConnect( <argumente wie connect>) {
    disconnect( ... );
    connect( ... );
}
Und konsequent in deinem Projekt diese Methode verwenden.

2) In deiner Klasse einfach eine Methode setzen, die bei Klick auf die Checkbox ausgeführt wird:

Code: Alles auswählen

bool Dlg::enableFeature( bool on ) {
  if( on && !m_featureEnabled ) {
    m_featureEnabled = true;
    connect( ... );
    return true;
  }
  if( !on && m_featureEnabled ) {
    m_featureEnabled = false;
    disconnect( ... );
    return true;
  }
  return false;
}
Das sollte das sicherste sein. Und ganz sicher bist du, wenn der Slot, der bei einem enableFeature( true ) connected wird, noch private ist. So kann man nur über diese definierte Schnittstelle connecten, das Prüfen auf m_featureEnabled verhindert mehrfaches connecten.

Grüße
Franz

Verfasst: 6. Mai 2009 13:57
von CKassiopaia
Besten Dank!
Klappt....so hab ich das auch gemacht!