Archiv verlassen und diese Seite im Standarddesign anzeigen : SLot mit Pointer auf Klasse als Argument?
Hallo,
ich würde gerne einen connect durchführen wo ich bei klicken auf einen Button
einen Pointer auf eine Klasse übergebe...
also z.B. so:
QObject::connect( button, SIGNAL( clicked() ), this, SLOT( myslot(*pToClass) ) );
Natürlich geht das so nicht...
wie man int an einen slot übergibt weiß ich bereits...
aber bei Pointern....ajajaj.
Ich meine....was ist denn ein Typ einer KLasse ? Die Klasse selbst ?
Wäre nett wenn mir jemand ein Code snippet geben könnte...
Danke
Hallo Mat,
du schreibst dann tatsächlich den Klassennamen, also z.B. QWidget* in das connect.
Es können aber Probleme dabei auftreten, jedenfalls hatte ich die. QWidget* ist nämlich nicht gleich QWidget *. Du solltest also im connect und im tatsächlichen Slot eine Variante davon benutzen und nicht mischen. Mit den Leerzeichen muss man höllisch aufpassen. Vielleicht ist das aber auch nur unter Windows so.
Schöne Grüße,
anda_skoa
09-11-2005, 13:34
Eine Signal/Slot Verbindung ist ansich nur eine Methodenaufruf zu einem späteren Zeitpunkt.
D.h. das Signal brauch logischerweise mindestens soviele Daten wie der Slot erwartet.
D.h. bei einem Signal ohne Parameter, kann man nur Slots ohne Parameter verwenden.
In so einem Slot kann man dann natürlich jede beliebige Methode aufrufen.
Ciao,
_
hmm bei mir sieht das nun so aus..
connect( pButt, SIGNAL(clicked(MyClass&)), this ,SLOT(myMethod(MyClass&)));
und die methode:
void MyClass2::myMethod(MyClass& my)
aber so gehts natürlich nicht....
jemand ne idee ?
Hallo Mat,
ja, so geht es nicht, weil clicked() keine Parameter besitzt.
Warum möchtest du denn MyClass2 überhaupt übergeben? Gibt es mehrere Objekte davon, die du unterscheiden musst? Kannst du etwas genauer beschreiben, was der Klick auf den Button bewirken soll?
Schöne Grüße,
anda_skoa
11-11-2005, 08:57
Praktisch drei Möglichkeiten:
- ein Slot ohne Argumente und QObject::sender auswerten
- ein Slot mit int Parameter, QSignalMapper und in einem switch() den int auswerten
- ein QPushButton Subklasse, die ein entsprechendes Signal hat
Ciao,
_
Hallo, wiedereinmal danke für die Hilfestellungen...
trotzdem komme ich nicht voran.
Also vielleicht nochmals meine kurze Erklärung was ich brauche:
Ich habe eine Klasse K1 in deren Konstruktor ich nun den Konstruktor einer Klasse K2 aufrufe....(dies wird auf dem Heap getan also mit new. ).
Soweit so gut.
Ich brauche aber in der Klasse K2 Zugriff auf die Widgets (z.B. PushButtons oder LabelEdits.) deshalb will ich dem Konstruktor von K2 die Klasse K1 übergeben damit ich ja zugreifen kann. Dies geschieht mit K2 k = new K2(*k1);
also ein Pointer auf K1.
Das funktioniert auch...zumindest kann ich im Konstruktor von K2 auf die Widgets zugreifen....aber z.B ein entry auslesen liefert mir immer nur die Adresse und nicht den eigentlich "string" der drinnensteht :confused:
Das wäre mein erstes Problem...
Mein Zweites ist wie ich nun im Konstruktor von K2 einen Slot aufrufen kann der dann ebenfalls Daten aus K1 auslesen kann. Also wollte ich im connect eben den Pointer auf K1 übergeben um dann in der slot-methode wiederrum auf die Widgets zugreifen zu können.
Aber das will einfach nicht klappen. ...
Wenn jemand eine bessere einfachere Idee hat wie ich das sinnvoll bewerkstelligen kann wäre ich zu tiefst dankbar!!!
Vielleicht auch der Code-ausschnitt mit dem ich den Pointer auf die Klasse dem Slot übergeben kann weil ich nun schon stundenlang dies versuche ohne erfolg.....
Danke euch
Grüsse
anda_skoa
12-11-2005, 16:03
Du mußt dir lediglich den Pointer merken.
Grob in etwa so:
class K2 : public QObject
{
Q_OBJECT
public:
K2(K1* k1);
private:
K1* m_k1;
private slots:
void slotButtonClicked();
};
K2::K2(K1* k1) : QObject(0, "K1"), m_k1(k1)
{
QPushButton* button = new QPushButton("Click Me", k1);
QObject::connect(button, SIGNAL(clicked()), this, SLOT(slotButtonClicked()));
}
void K2::slotButtonClicked()
{
m_k1->methodeVonK1();
}
Ciao,
_
Powered by vBulletin® Version 4.2.5 Copyright ©2025 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.