Signals und Slots für Dummies :-/

Verschiedenes zu Qt
Antworten
coffeejunky24
Beiträge: 16
Registriert: 24. April 2006 20:49
Wohnort: RhPf
Kontaktdaten:

Signals und Slots für Dummies :-/

Beitrag von coffeejunky24 »

Hallo Allerseits!

Ich fange grade an mich mit Qt zu beschäftigen und bin schon am verzweifeln.
Es dreht sich um ganz einfache Signals und Slots Verknüpfungen...

Im Tutorial verknüpft man einen Slider mit einem LCD:
connect(slider, SIGNAL(valueChanged(int)),lcd, SLOT(display(int)));

Klappt auch super....

Ich möchte aber gerne einen PushButton mit dem LCD verknüpfen. Bei jedem clicked() soll der vom LCD angezeigte Wert um 1 steigen.
Irgendwie funktioniert hier aber garnichts..

Solche Sachen habe ich probiert:

connect(plus, SIGNAL(clicked()),lcd, SLOT(display(++int)));
connect(plus, SIGNAL(clicked()),lcd, SLOT(display(++Wert)));
void StdEingabe::on_plus_clicked() {Wert++; lcd->display(Wert);}


Ich scheine komplett daneben zu liegen... Der LCD zeigt immer "0" bzw Wert an und ändert sich nie...

Ich würde mich wirklich freuen wenn sich jemand dazu erbarmen könnte mir das Prinzip nochmal für Dumme zu erklären!!

Danke und viele Grüße, Jan

PS: Falls das relevant ist -> Windows und QT4.1
Adi
Beiträge: 87
Registriert: 1. Januar 2006 14:51

Beitrag von Adi »

Das geht so nicht. beim connect verbindest du quasi nur die Funktoinen miteinander (ganz einfach ausgedrückt)

Du kannst aber eigene Slots definieren.

Dazu deklarierst du in der H-Datei im Abschnit private slot: deine Funktion. Z.B. MySlot(int myvalue)

In der entsprechende C-Datei schreibst du nun die Funktion. Beispiel:

Code: Alles auswählen

void myclas::MySlot(int myvalue)
{
  // mach wass die willst
  // z.B. Wert neu setzen
}
Und kannst dan mit connect(slider, SIGNAL(valueChanged(int)),this, SLOT(MySlot(int))); verbinden.

:arrow: Es gib im Forum auch bereits Beiträge davon und der QT-Assistant ist auch ziemlich hilfreich.
Zuletzt geändert von Adi am 25. April 2006 08:02, insgesamt 2-mal geändert.
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:

Re: Signals und Slots für Dummies :-/

Beitrag von macman »

coffeejunky24 hat geschrieben:Ich würde mich wirklich freuen wenn sich jemand dazu erbarmen könnte mir das Prinzip nochmal für Dumme zu erklären!!
Da gibt es nicht viel zu erklären. In der Doku steht ganz klar:
The signature of a signal must match the signature of the receiving slot. (In fact a slot may have a shorter signature than the signal it receives because it can ignore extra arguments.)
Vielleicht sollte man das doch mal in die FAQ aufnehmen, obwohl es nicht gerade sinnvoll erscheint. Schließlich steht die Lösung in der Doku.
Adi
Beiträge: 87
Registriert: 1. Januar 2006 14:51

Beitrag von Adi »

@macman

Ich glaube, dein Zitat ist nicht das aktuelle Problem von coffeejunky24 sondern, dass er im Moment das Grundprinzip von connect nicht versteht.

Ein FAQ währe nicht schlecht, da dieses Thema in der letzte Zeit mehrfach angesprochen wurde.
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:Ein FAQ währe nicht schlecht, da dieses Thema in der letzte Zeit mehrfach angesprochen wurde.
Angesprochen? Besprochen meinst Du wohl :-) So gesehen bringt eine FAQ auch nichts, wenn die User nicht mal in der Lage sind die Suche zu benutzen. Das ist aber überall zu beobachten, nicht nur hier, auch in diversen Newsgroups. Da wird einfach mal gefragt, obwohl man in der Zeit, in der man die Nachricht schreibt, längst eine Antwort hätte finden können.
Spielgrips
Beiträge: 51
Registriert: 8. März 2006 23:09
Kontaktdaten:

Beitrag von Spielgrips »

Sagen wirs mal sooo:

connect(button, was_ich_mach_event(), lcd, was_soll_gemacht_werden_slot());

und die Events mit SIGNAL() casten und eben mit SLOT() die Slots...

:arrow: Das anteuern mit Button auf LCD hatte ich mal gezeigt bei einem Thread:
http://www.qtforum.de/forum/viewtopic.p ... highlight=
(Weiter runter scrollen...) Nur das eben 1 angezeigt wird beim Button betätigen..
coffeejunky24
Beiträge: 16
Registriert: 24. April 2006 20:49
Wohnort: RhPf
Kontaktdaten:

Beitrag von coffeejunky24 »

Vielen Dank für alle hilfreichen Antworten.

Natürlich hab ich versucht in der Doku durchzusteigen und auch hier gesucht. Ich dachte auch mehrmals ich habe den Lösungsansatz gefunden und dann versucht den umzusetzen... compiler fehler habe ich selten aber ich darf andauernd Problemberichte and Microsoft senden :-)

Ich befürchte das Problem ist, dass ich auch neu in der C++ Programmierung bin und da wohl irgendwelche Konventionen nicht einhalte.

Die Lösung von Spielgrips ließ sich einwandfrei anpassen und kompilieren. Kaum habe ich versucht das in eine header udn eine cpp Datei auszulagern -> Problembericht an Microsoft senden :-/

Ich versuche morgen nochmal weiter dran herum und sollte ich es wieder nicht hinbekommen belästige ich euch evtl mal mit meinem Quellcode!

Bis dahin nochmal Danke an Alle!
coffeejunky24
Beiträge: 16
Registriert: 24. April 2006 20:49
Wohnort: RhPf
Kontaktdaten:

Beitrag von coffeejunky24 »

Hi!

Ich nochmal :-)

Habe mich entschlossen erstmal so weiterzuarbeiten.. aber würde gerne noch eine weitere Frage hier anhängen...

In meinem C Programm lässt sich folgender Code problemlos compilieren:
*schnip*
hLib = LoadLibrary("xyz.dll");
*schnap*

in meinem QWidget jedoch bekomme ich folgende Fehlermeldung:
cannot convert "const char*" to "const WCHAR*"

Könnte mir evtl jemand kurz erklären wo der Fehler liegt oder hat evtl nen Lösungsvorschlag?

Schonmal vielen Dank im Voraus!!


PS: Sorry für mein Unverständnis der ganzen Materie
svenstar
Beiträge: 3
Registriert: 3. April 2006 18:03

Beitrag von svenstar »

Ich vermute mal, dass du hLib als WCHAR* deklariert hast...
WCHAR sind 2Byte, damit man zum Beispiel auch Kyrillisch darstellen kann, wobei char nur einByte ist ( das "xyz.dll" )

deklariere das hLib um, dann müsste es gehn...

Mfg Svenstar
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

svenstar hat geschrieben: deklariere das hLib um, dann müsste es gehn...

Mfg Svenstar
Was soll das denn sein?


Das Problem hat rein gar nichts mit Qt zu tun (und ich verstehe nicht wozu man LoadLibrary in einem Qt-Programm braucht). Es liegt einfach daran, dass Qt mit Unicode-Unterstützung compiliert ist und man deshalb (zwangsläufig) auch die Unicode-WinAPI-Funktionen verwendet. Also übergib LoadLibrary anstatt einem char* einen Unicode-String und fertig.

LoadLibrary("xyz.dll"L) oder LoadLibrary((WCHAR*)QString("xyz.dll").utf16()) oder man benutzt die Ansi-Version -> LoadLibraryA("xyz.dll")

Ausserdem: http://doc.trolltech.com/4.1/qlibrary.html
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Antworten