Seite 1 von 2

Eigene Slots

Verfasst: 28. März 2006 22:57
von stefan-tiger
Hallo,

haba mal angefangen mit KDevelop usw. was zu machen und bin jetzt aber auf reines Qt 4.1.1 mit dem Designer umgestiegen, da die Anwendung auch auf Windows laufen soll.

Leider hab ich noch nicht herausgefunden wie ich eigene Slots mit dem Designer machen kann.

Ich hab jetzt einen Button, der hat das Sinal clicked() und ich verbinde es mit dem Formular-Widget mit einem eigenen Slot.

So hab ichs bisher immer gemacht. Aber wie leg ich nun so einen unte rdem "neuen" Designer an?

Verfasst: 29. März 2006 01:13
von Volker
Ohne absolute Gewissheit glaube ich, dass das mit dem neuen Designer nicht möglich ist

Verfasst: 29. März 2006 07:36
von stefan-tiger
Volker hat geschrieben:Ohne absolute Gewissheit glaube ich, dass das mit dem neuen Designer nicht möglich ist
Warum das denn?

Und wie mach ich es sonst?

Ich habe eine Klasse die von der ui.Klasse abgeleitet ist.

Habe in der abgeleiteten Klasse einen eigenen Slot hinzugefügt und dann im Konstruktor der abgeleiteten Klasse den "connect" gemacht. Funktioniert aber nicht.

Verfasst: 29. März 2006 08:20
von michams
Ich hab jetzt einen Button, der hat das Sinal clicked() und ich verbinde es mit dem Formular-Widget mit einem eigenen Slot.
So sollte es gehen, mit dem komischen Verhalten, daß der Designer 4.x keine eigenen Slots zuläßt. Wie man das direkt umgehen kann, weiß ich auch nicht.

Die connect Methode ist die zweite Variante, warum die bei dir nicht geht,...???

Außerden gibt es noch die on_<widget>_<action> methode.
Dazu erzeugst du einen private slot mit eben dieser Form. Also zB ein Button namens btnPush bekommt einen Slot on_btnPush_clicked().

Die Funktion wird automatisch aufgerufen, wenn das entsprechende signal (hier clicked()) gesendet wird.

Verzweifelt..

Verfasst: 29. März 2006 09:04
von stefan-tiger
... poste ich mal mein Quellcode.

Ich versteh nicht warum der "connect" nicht funktioniert.

Siehe Anhang, mit Übersetzungsscript "build.sh".

Gruß

Verfasst: 29. März 2006 13:52
von stefan-tiger
Ok, hab den Button nun in Gang bebracht. Allerdings verstehe ich nicht warum ich den "connect" nur von ausserhalb und nicht im Konstruktor der Widget-Klasse (die von der ui-Widget-Klasse abgeleitet ist) machen kann.

Würde mcih freuen wenn mir das jemand erklärt.

Code im Anhang.

Verfasst: 29. März 2006 16:46
von Adi
michams hat geschrieben:... Außerden gibt es noch die on_<widget>_<action> methode. ....
Wo ist das denn dokumentiert? Ich habe das nicht gefunden und würde mir enorm helfen...

Hallo Stefan
stefan-tiger hat geschrieben:... Allerdings verstehe ich nicht warum ich den "connect" nur von ausserhalb und nicht im Konstruktor der Widget-Klasse (die von der ui-Widget-Klasse abgeleitet ist) machen kann....
Ich würde qubawidgetbase.h direkt in quba einbinden und nicht über einen Umweg machen. Aber das ist geschmacksache.

Ich habe leider dein Code nicht zum Laufen gebracht da es irgendwo abstürtzt.

So wie ich das sehe, initialisierts du qubaWidget nicht mit einem new. Daher wird der Construct nicht ausgeführt.

Verfasst: 29. März 2006 18:01
von michams
Wo ist das denn dokumentiert? Ich habe das nicht gefunden und würde mir enorm helfen...
Such im Assistenten mal nach "on_" oder "Auto-Connect". Da sollte ein Eintrag auftauchen "Using a Component in Your Application" dort drin ganz unten.

Außerdem gibt es im QMetaQbject die Funktion "connectSlotsByName", da steht ein wenig drin.
Im Prinzip mußt du nur die Slot Funktion nach dieser Methode anlegen, den Rest mach der moc. Soweit ich weiß, geht das für so ziemlich alle Widgets und Signale.

Verfasst: 29. März 2006 21:11
von stefan-tiger
michams hat geschrieben:
Ich würde qubawidgetbase.h direkt in quba einbinden und nicht über einen Umweg machen. Aber das ist geschmacksache.

Ich habe leider dein Code nicht zum Laufen gebracht da es irgendwo abstürtzt.

So wie ich das sehe, initialisierts du qubaWidget nicht mit einem new. Daher wird der Construct nicht ausgeführt.
Nein, ich will noch eine Zwischenstufe, da sich "qubawidgetbase.h" ständig ändert. Ich änder ständig die GUI mit dem Designer und in meinem Build-Script übersetzt mit dem uic auch immer neu.

Im Anhang findest du eine aktuelle Version, die auch unter Windows geht (habs selbst getestet), mit einer "build.bat".

Mit dem Initialisieren liegst du falsch, denn ein Konstruktor wird immer ausgeführt wenn ein Objekt erzeugt wird, egal wie. Unter Linux sieht du das wegen den "cout"-Aufrufen, die seltsamerweise unter Windows nicht gehen (genausowenig wie die QDebug-Aufrufe).

Also geklärt ist die Sache damit noch nicht.

Verfasst: 29. März 2006 22:06
von Adi
stefan-tiger hat geschrieben:...Mit dem Initialisieren liegst du falsch....
Ja, da hast du recht, ich habe falsch geschaut.

Aber scheinbar kann ich dir da leider nicht weiterhelfen, da ich die Ui anders einbinde (ohne Umweg obschon ich auch den Designer verwende) und ich statt mit QWidget mit QDialog arbeite. Daher sieht bei mir der Construct auch etwas anders aus.

Aber ich schaue mal weiter. Vielleich komme ich noch drauf...

Übrigens habe ich meine QT 4.1.1 Obensource ins VS C++ 2005 Express eingebunden und da geht qDebug zum Glück :wink:

Verfasst: 30. März 2006 12:33
von Adi
michams hat geschrieben:Außerden gibt es noch die on_<widget>_<action> methode.
Dazu erzeugst du einen private slot mit eben dieser Form. Also zB ein Button namens btnPush bekommt einen Slot on_btnPush_clicked().

Die Funktion wird automatisch aufgerufen, wenn das entsprechende signal (hier clicked()) gesendet wird.
Das funktioniert wirklich ausgezeichnet, cool 8)
Ich werde mein Projekt gelegendlich umstellen.

@stefan-tiger
Vielleich währe das die schönere Lösung, als sich mit Connect herumzuschlagen?

Verfasst: 30. März 2006 12:45
von macman
Adi hat geschrieben:Vielleich währe das die schönere Lösung, als sich mit Connect herumzuschlagen?
Näää. Ich nutze das überhaupt nicht, da man es nicht debuggen kann. Du hast einen Tippfehler im Prozedurnamen oder die Parameter stimmen nicht überein. Schon wird dein Slot nie aufgerufen, aber finde das mal.

Dann hat man oft eigene Connections und schon hätte man ein Mischmasch aus manuell und automatisch erstellten Connections. Nee, da mache ich das lieber selbst.

Verfasst: 30. März 2006 14:10
von stefan-tiger
Will schon eigene Slots verwenden und nicht die automatischen.

Also zurück zur Frage: Warum kann ich den "connect" nicht im Konstruktor meiner Widget-Klasse machen?

Verfasst: 30. März 2006 14:37
von michams
macman hat geschrieben: Näää. Ich nutze das überhaupt nicht, da man es nicht debuggen kann. Du hast einen Tippfehler im Prozedurnamen oder die Parameter stimmen nicht überein. Schon wird dein Slot nie aufgerufen, aber finde das mal.
Wo ist denn da der Unterschied? Breakpoint reinsetzen und schauen, ob er aufgerufen wird. Falls nicht, stimmt wohl was nicht und so viele Fehlerquellen gibt's da nun auch wieder nicht, als daß man tagelang herumstochern könnte, bevor man merkt, daß der Name nicht ganz stimmt.
Und ob ein Slot auch wirklich aufgerufen wird, ist doch eigentlich das erste, was man nach dem Einbauen testet, egal wie er connected wurde.

Verfasst: 30. März 2006 16:06
von macman
stefan-tiger hat geschrieben:Also zurück zur Frage: Warum kann ich den "connect" nicht im Konstruktor meiner Widget-Klasse machen?
Weil es den btnStartGame zu dem Zeitpunkt noch nicht gibt. Zumindest sagt das mein Debugger :-)