QTimer::singleshot führt keine SLOTS mit Argumenten aus?!?!

Alles rund um die Programmierung mit Qt
Antworten
hulk
Beiträge: 10
Registriert: 21. Februar 2006 11:41

QTimer::singleshot führt keine SLOTS mit Argumenten aus?!?!

Beitrag von hulk »

hi

Ich möchte die Funktion "saveTraining()" 20 Sekunden nach einer anderen Funktion ausführen. Dazu ist, meiner Meinung nach, ein SingleShot-Timer genau die richtige Wahl.

Wenn ich folgenden Befehl in meiner Funktion ausführe

Code: Alles auswählen

QTimer::singleShot( 20000, this, SLOT(saveTraining()));
wird auch 20 Sekunden später meine Funktion "saveTraining()" aufgerufen. Klappt soweit alles gut.
Wenn ich jedoch versuche beim Aufruf des Befehls ein Argument zu übergeben:

Code: Alles auswählen

QTimer::singleShot( 20000, this, SLOT(saveTraining(5)));
wird meine Funktion "saveTraining(int zahl)" nicht ausgeführt.

Anmerkung:
-Ich habe bereits erfolglos versucht andere Argumente (z.B. QString, QPointF) zu übergeben.
-Der Compiler tut seine Arbeit ohne Fehlermeldung und Warnung
-In meiner .h-Datei steht der richtige Prototyp unter "public slots:"
-Ich habe ebenfalls versucht die übergebene Variable als Klassenvariable zu deklarieren. Ich dachte es könnte ein Problem sein, dass die aufrufende Funktion zum Zeitpunkt des Feuerns des Timers schon beendet und alle darin erzeugten Objekte (die zu übergebenen Variablen) schon zerstört sind.
-Version Qt 4.1.2 Open Source



Wo liegt mein Fehler? Kann man vielleicht bei einem Singleshot keine Argumente übergeben? In der Doku habe ich da jedenfalls keinen Satz drüber gefunden.

Hulk
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Re: QTimer::singleshot führt keine SLOTS mit Argumenten aus?

Beitrag von macman »

Das geht nicht, Du kannst bei einer Connection einem Slot keine Parameter übergeben. Du musst einen normalen QTimer nehmen und ein eigenes Signal mit deinem Slot verbinden. Von der Funktion her nichts anderes, nur etwas mehr Tipperei.
medi
Beiträge: 16
Registriert: 2. März 2006 13:25

keine SLOTS mit Argumenten

Beitrag von medi »

Hallöle,

ich habe eine ähnliche Frage:

Folgendes funktioniert:

Code: Alles auswählen

void slotTreeChoose(const QModelIndex &index);

connect(tree_menue, SIGNAL(clicked(const QModelIndex &)), this, SLOT(slotTreeChoose(const QModelIndex &)));
Das verleitete mich zu der Annahme, dass man Slots mit Argumenten versehen kann.

Folgendes funktioniert jedoch nicht (ohne Argumente wird der Slot abgearbeitet)

Code: Alles auswählen

void slotSearchList(QString test);

connect(win_search->P_but_search, SIGNAL(clicked()), this, SLOT(slotSearchList("test")));
Bitte könnte das jemand mal erklären?
hulk
Beiträge: 10
Registriert: 21. Februar 2006 11:41

Beitrag von hulk »

hi.

Ja, ich kann dir darauf antworten. Ich als Initiator dieses Threads hatte das gleiche Problem und habe den gleichen dummen Fehler gemacht.

Wenn man den Fehler in einem Satz ausdrücken möchte, würde dieser lauten: "Man kann keinem SIGNAL/SLOT in einem CONNECT-Aufruf Parameter geben".

Das System bei QT ist folgendermaßen. Man hat Objekte (in deinem Fall tree_menue), die Signale ausgeben können. Diese Signale können entweder ohne oder mit Paramter ausgegeben werden (z.B. das Signal clicked() eines QPushButtons oder das Signal textChanged (const QString & text) eines QLineEdits).

Desweiteren gibt es Objekte, die SLOTS besitzen. SLOTS sind ganz normale Funktionen, die nicht nur direkt durch einen Methodenaufruf ausgeführt werden können, sondern auch durch ein Signal.

Hier kommt der connect-Aufruf ins Spiel. Damit dein Programm weiß, dass es SLOT X ausführen soll, wenn SIGNAL Y ausgegeben wird, ist dieses connect nötig. In diesem connect sagst du: "Wenn SIGNAL Y ausgegeben wird, dann nehme dir einen Teil (oder alle) übergebenen Parameter und starte damit die Funktion (SLOT) X.

Und da liegt der Hase im Pfeffer: Wenn das Signal keine Paramter übergibt, kann der Slot auch keine Paramter empfangen.
Das heißt für dich: Entweder musst du ein Signal deines Objektes benutzen, dass den gewünschten Parameter übergibt oder du musst dir selbst ein Signal erstellen. Mittels "emit nameDesSignals (param1, param2)" kannst du dieses Signal dann ausgeben und dein Slot kann diese Paramter benutzen.

Ich hoffe das hat deine Frage beantwortet
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Beitrag von macman »

Du kannst Slots mit Argumenten versehen, aber nur wenn das Signal auch welche verschickt. Halt dich einfach daran, damit eine Connection funktioniert, müssen Signal und Slot identisch sein.
medi
Beiträge: 16
Registriert: 2. März 2006 13:25

Beitrag von medi »

Vielen Dank für die guten Erklärungen und das schnelle Antworten.

Weil der Button ziemlich sicher kein Signal hat, welches mir Inhalte von QLineEdit's mitliefert, werde ich eigene Signale erstellen müssen.

Oder ich mache es noch ganz anders...

Tschau Annett
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Beitrag von macman »

Wieso sollte ein Button ein Signal mit dem Inhalt eines LineEdits verschicken, von dem er erstmal gar nichts weiß? Noch schlimmer im Slot. Der wird beim Klicken eines Buttons aufgerufen und bekommt einen String übergeben, von dem nicht ersichtlich ist woher er ist. In einem halben Jahr stehst Du davor und blickst da nicht mehr durch :-)

Da ist es doch wirklich besser der Button verschickt nur ein Signal 'Ich wurde geklickt' und der Slot weiß dann was zu tun ist. Der holt sich den Text aus dem LineEdit usw.
medi
Beiträge: 16
Registriert: 2. März 2006 13:25

Beitrag von medi »

Ja, genau das habe ich jetzt gemacht.
get_text1, get_text2, u.s.w.
In einem halben Jahr weiß ich dann mehr :)
Antworten