Eigene Slots

Verschiedenes zu Qt
stefan-tiger
Beiträge: 49
Registriert: 28. März 2006 22:52

Eigene Slots

Beitrag 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?
Volker
Beiträge: 343
Registriert: 30. Juni 2005 05:27

Beitrag von Volker »

Ohne absolute Gewissheit glaube ich, dass das mit dem neuen Designer nicht möglich ist
stefan-tiger
Beiträge: 49
Registriert: 28. März 2006 22:52

Beitrag 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.
michams
Beiträge: 56
Registriert: 14. November 2005 18:24

Beitrag 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.
stefan-tiger
Beiträge: 49
Registriert: 28. März 2006 22:52

Verzweifelt..

Beitrag von stefan-tiger »

... poste ich mal mein Quellcode.

Ich versteh nicht warum der "connect" nicht funktioniert.

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

Gruß
Dateianhänge
quba_2006-03-29_01.tar.gz
Button "btnStartGame" funktioniert nicht mit dem "connect"
(27.4 KiB) 224-mal heruntergeladen
stefan-tiger
Beiträge: 49
Registriert: 28. März 2006 22:52

Beitrag 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.
Dateianhänge
quba_2006-03-29_02.tar.gz
Hier gehts, allerdings ist der "connect" nicht da wo ich ihn ursprünglich haben wollte.
(30.85 KiB) 230-mal heruntergeladen
Adi
Beiträge: 87
Registriert: 1. Januar 2006 14:51

Beitrag 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.
Win 2k, Win XP
QT Win Opensource 4.1.1
MinGW 3.4.2
michams
Beiträge: 56
Registriert: 14. November 2005 18:24

Beitrag 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.
stefan-tiger
Beiträge: 49
Registriert: 28. März 2006 22:52

Beitrag 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.
Dateianhänge
quba_2006-03-29_03.zip
Geht unter Linux und Windows. Mit bulid-Scripte jeweils.
(138.86 KiB) 209-mal heruntergeladen
Adi
Beiträge: 87
Registriert: 1. Januar 2006 14:51

Beitrag 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:
Win 2k, Win XP
QT Win Opensource 4.1.1
MinGW 3.4.2
Adi
Beiträge: 87
Registriert: 1. Januar 2006 14:51

Beitrag 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?
Win 2k, Win XP
QT Win Opensource 4.1.1
MinGW 3.4.2
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Beitrag 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.
stefan-tiger
Beiträge: 49
Registriert: 28. März 2006 22:52

Beitrag 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?
michams
Beiträge: 56
Registriert: 14. November 2005 18:24

Beitrag 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.
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Beitrag 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 :-)
Antworten