Seite 1 von 1

[gelöst] Warum kann ich keine Verbindung mit einem SLOT...

Verfasst: 20. Mai 2005 14:00
von Saiyaman
Hi!

Code: Alles auswählen

	// Copy-Menu
	itsDataCopyMNU->clear();
	for (unsigned int i = 0; i < itsCat.size(); i++)
	{
		itsDataCopyMNU->insertItem(QPixmap(QImage("icons/dublicate.png")), itsCat[i].getName(), this, SLOT(copyEntry(i)));
	}
Warum wird der Slot CopyEntry(unsigned int); nich aufgerufen? Wenn ich es ohne Argument (unsigned int) mache und ohne i bei der Connection, dann geht es.

Irgendwie gehen nur Dinge wie:

Code: Alles auswählen

connect(sender, SIGNAL(sig(unsigned int)), reciever, SLOT(slo(unsigned int)));
emit sig(8);
// slo(unsigned int) wird aufgerufen...
Aber nie, leider niemals:

Code: Alles auswählen

unsigned int i = 8;
connect(sender, SIGNAL(sig()), reciever, SLOT(slo(unsigned int i)));
emit sig();
// slo(unsigned int) wird NICHT aufgerufen...
Warum ? Ich habe so viele Stellen, wo ich so arbeiten möchte, aber es geht nicht.

MfG

Verfasst: 20. Mai 2005 14:51
von ArneStocker
.. so geht das auch nicht. Du kannst allerdings einen Parameter im Slot übergeben, solltest es aber folgendermassen implementieren

Code: Alles auswählen

	const int BASIS_ID = 100; 	// vorsorglich ausserhalb des Bezugsrahmens definieren

	pMenu->insertItem(... SLOT(copyEntry(int)),0,ID_BASIS + i);
	pMenu->setItemParameter(ID_BASIS + i, i);
hoffentlich geht's

Gruss Arne

Verfasst: 20. Mai 2005 15:59
von FlorianBecker
Hallo,

woher weisst du, das du einen Paramter im SLOT übergeben kannst? Nach meinem Kentnisstand kannst du keinen Paramter übergeben, sondern bekommst die id des insertItems nur mit, wenn du die IDs zuordnest, also etwa so:

Code: Alles auswählen

int id = insertItem( ... );
Steht das irgendwo in der Doku mit dem einen Wert übergeben? Interessiert mich, da ich das öfters brauchen könnte. Danke.

Verfasst: 21. Mai 2005 03:50
von ArneStocker
das ergibt sich aus der DOKU zu setItemParameter(ID_MENUEINTRAG, integerparamter).

Ich habe eine unbekannte Anzahl von unbekannten Objekten, die ich in einem Unternenü darstellen möchte. Werden sie ausgewählt, soll das betreffende Objekt geöffnet werden. Also erzeuge ich für jedes Objekt einen Menüeintrag, dem eine eindeutige ID zugeordnet ist (bei mir ID_BASIS + i) und weise diesem Menüeintrag einen Integerwert zu (in diesem Fall die I'te Position in einer Liste) der bei Aufruf an den SLOT übergeben wird.

Es könnte aber auch jeder andere Intergerwert übergeben werden. Z.B:

pMenu->setItemParameter(ID_IRGENDEINE, 200 * 3 / 6 + i)

es funktioniert. Leider kann man bei einem Menüereignis nur Integerparameter an den SLOT übergeben und nicht wie bei selbst gebauten (und selbst ausgelösten) SIGNALS mit beliebige Werte oder Objekte. Aber man kann sich je (wie oben) mit einer Liste von Objekten behelfen.

Gruss Arne

Verfasst: 21. Mai 2005 12:05
von FlorianBecker
Jetzt wo du es sagst, ich glaube darüber bin ich mal gestolpert, oder habe das dann wohl auch so ähnlich gemacht. Zumindest wird das int im SLOT des insertItem's wieder vertrauter.

Danke für die Erklärung.

Verfasst: 21. Mai 2005 13:02
von kowi1134
FlorianBecker hat geschrieben:Hallo,

woher weisst du, das du einen Paramter im SLOT übergeben kannst? Nach meinem Kentnisstand kannst du keinen Paramter übergeben, sondern bekommst die id des insertItems nur mit, wenn du die IDs zuordnest, also etwa so:

Code: Alles auswählen

int id = insertItem( ... );
Steht das irgendwo in der Doku mit dem einen Wert übergeben? Interessiert mich, da ich das öfters brauchen könnte. Danke.
Ich bin mir zwar nicht sicher, genau zu wissen wie das mit den signals und slots intern abläuft, aber ich glaube, man kann es sich der Anschauung halber so vorstellen (und nach dieser Methode funktioniert es auch):

Der Witz der signals ist, dass sie in der Klassendefinition so auftauchen:

Code: Alles auswählen

class XY
{
Q_OBJECT
...
signals:
  void mySignal(int arg);
...
}
Und innerhalb einer Methode dieser Klasse z.B. so aufgerufen werden, aber ohne irgendwo eine Methode mit dem Namen des signals einzurichten:

Code: Alles auswählen

int myArgument = 329; // der Wert spielt keine Rolle
emit mySignal(myArgument);
Irgendwo steht jetzt beispielsweise:

Code: Alles auswählen

QObject::connect(sender, SIGNAL(mySignal(int)), reciever, SLOT(mySlot(int)) );
Und die Definition von dem Slot sieht beispielsweise so aus:

Code: Alles auswählen

class ABC
{
Q_OBJECT;
...
public slots:
  mySlot(int argument) { /*mach was*/ }
...
}
Für die Anschauung reicht es, wenn Du Dir vorstellst, dass Qt für Dich den Code so umschreibt, als stände an der Stelle mit

Code: Alles auswählen

emit mySignal(myArgument);
dann ein Aufruf Deiner Slot-Methode, der Du myArgument übergibst.

Ich hoffe, wirklich, dass ich hier keinen Mist verzapfe, aber auf diese Weise habe ich jetzt schon mehrere signals und slots ausprogrammiert und alle haben funktioniert.

Ciao
Konrad

Verfasst: 22. Mai 2005 19:49
von Saiyaman
Danke. Problem gelöst.

MfG