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

Alles rund um die Programmierung mit Qt
Antworten
Saiyaman
Beiträge: 111
Registriert: 20. Mai 2005 13:52

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

Beitrag 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
ArneStocker
Beiträge: 300
Registriert: 3. November 2004 16:15
Wohnort: Berlin

Beitrag 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
FlorianBecker
Beiträge: 1213
Registriert: 2. Dezember 2004 10:54
Kontaktdaten:

Beitrag 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.
ArneStocker
Beiträge: 300
Registriert: 3. November 2004 16:15
Wohnort: Berlin

Beitrag 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
FlorianBecker
Beiträge: 1213
Registriert: 2. Dezember 2004 10:54
Kontaktdaten:

Beitrag 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.
kowi1134
Beiträge: 120
Registriert: 1. Mai 2005 17:48
Wohnort: Arnsberg

Beitrag 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
Zuletzt geändert von kowi1134 am 22. Mai 2005 19:51, insgesamt 1-mal geändert.
Saiyaman
Beiträge: 111
Registriert: 20. Mai 2005 13:52

Beitrag von Saiyaman »

Danke. Problem gelöst.

MfG
Antworten