Seite 1 von 1

Qt4: Singal und Slot

Verfasst: 13. Oktober 2006 21:13
von joebar
Hallo,

ich bin etwas verwirrt mit den Singalen und Slots. Im wesentlichen zwei Fragen fuers erste:

1. Im Designer kann ich Signale und Slots verbinden. Jetzt muss ich im meinem C++ Code aber immer noch manuell sowas wie

Code: Alles auswählen

connect(okButton, SIGNAL (clicked()), this, SLOT(slotClose()));
einbauen. Wieso muss ich an zwei Stellen zweimal das gleiche pflegen? In einem frueheren Thread hattet ihr mir netterweise folgenden Beispiel Code gegeben:

Code: Alles auswählen

#include "testapp.h"

#include <QtGui>
#include <QtCore>

TestApp::TestApp(QDialog *parent) : QDialog(parent)
{
setupUi(this);
connect(okButton, SIGNAL (clicked()), this, SLOT(slotClose()));

}

TestApp::~TestApp()
{}

void TestApp::slotClose()
{
close();
}
Ich hatte eine Anwendung mit einem OK und einem Cancel Button angelegt. Im Coding oben ist nur der OK Button erwaehnt, der Cancel Button funktioniert aber auch . Im Designer ist angegeben:

okButton clicked() TestApp accept()
cancelButton clicked() TestApp reject()

Damit stimmt das mit dem ok Button im Designer nicht mit dem im Coding ueberein.

Also wann muss ich was machen?

2. Was muss ich machen wenn ich einen eigenen Slot anlegen will? Das geht im Designer ja nicht mehr. Ich will beim Druecken des OK buttons eine MessageBox erzeugen. Wollte dazu einen Slot/Methode/Funktion showBox() anlegen. Ich vermute, dass ich im Designer gar nichts machen muss aber im obigen Coding den connect String manuell anlegen muss. Ist meine Vermutung da richtig?

Danke,
J.

Verfasst: 16. Oktober 2006 11:04
von RHBaum
1 wenn du im designer die slots der buttons verbindest, brauchst das im quellcode nicht noch mal haendisch tun ....

Code: Alles auswählen

setupUi(this);
connect(okButton, SIGNAL (clicked()), this, SLOT(slotClose())); 
wo bitte ist denn dein OK button ? ^^
denk mal den hasst du im designer erstellt ....
Damit wird der ueber den moc generiert ... und ist definitiv kein direkter member deines Dialoges mehr sondern da drin, was du als UI file einbindest. Drauf zugreiffen muesstest also mit UI.okButton ... oder wie auch immer die UI membervariable heisst ....
der connect sollte also eh ins leere laufen

bei QDialog (wegen Accept und Reject) ist das verbinden von OK -> auf Close meist eh ned so guenstig, sondern Accept ist schon die bessere wahl .

2. Unter QT4 geht das leider nicht mehr ... daran hab ich mir am anfang auch die Zaehe ausgebissen ^^
Man kann auch nur noch Standard QT slots verbinden ... oder Slots die halt ueber die Benutzerdefinierte Steuerelemente Schnittstelle expliziet spezifiziert wurden. mit einfachen ableiten und damit neuen Slots kann man im Designer nicht mehr arbeiten.

eigene Slots und signale definiert man nur noch in der obersten klasse die das UI als member hat ....
Die Signale und slots der per designer eingebundenen Widgets und steuerelemente greift man per member drauf zu ... z.B.
connect(UI.okButton,SIGNAL(OnActivate()),this,SLOT(MySlot()))
oder per automatisch generiertem signal (wenn aktiviert)
connect(this,SIGNAL(okButton_OnActivate()),this,SLOT(MySlot()))

Bisserl gewoehnugsbeduerftig, aber fuer Standard 0815 dialoge durchaus ok. Fuer kompliziertere sachen wuerd ich eh nie den designer nehmen ...

Ciao ...

Verfasst: 16. Oktober 2006 19:40
von joebar
RHBaum hat geschrieben:1 wenn du im designer die slots der buttons verbindest, brauchst das im quellcode nicht noch mal haendisch tun ....

Code: Alles auswählen

setupUi(this);
connect(okButton, SIGNAL (clicked()), this, SLOT(slotClose())); 
wo bitte ist denn dein OK button ? ^^
denk mal den hasst du im designer erstellt ....
Ja im Designer erstellt.
RHBaum hat geschrieben:
der connect sollte also eh ins leere laufen
Laeuft nicht ins leere - nach meinem Verstaednis. Ich habe in die slotClose() Methode mal ein cout gehangen und sehe das auf der Konsole. Was mich hier noch wundert ist: Ich habe das close() aus meiner slotClose() Methode entfernt und trotzdem wird das Fenster geschlossen!


Danke,
J.

Verfasst: 16. Oktober 2006 20:00
von joebar
Fehler gefunden.

Ich hatte meinen manuellen Slot/Signal und noch den default aus dem Designer....

Danke, J.