QT: (gelöst) qPushButton Connect für ein Array
-
Hallo Zusammen,
hat jemand eine Idee, wie man ein Array von Pushbuttons
über einen Connect verbindet, welches auf einen einzige Slot
zeigt, welcher für alle QPushButton zuständig ist.Ich habe eine Reihe von Buttons, welche die gleiche Aufgabe
erledigen, auf Array Daten bezogen.Gruss
-
Einfach für jeden Button nach Erstellen ein connect, bevor der ins Layout gelegt wird?
Aber ich denke du hast die falsche Frage gestellt.
Wie schaffe ich es, in einem Slot zu sehen, wer das Signal ausgelöst hat?
Das geht so:
http://doc.trolltech.com/4.3/qsignalmapper.html
-
Hallo Kleiber,
die Frage ist wirklich etwas unglücklich gestellt.
Das mit dem Mapper kannte ich noch nicht, scheint aber
genau das zu sein, was ich machen will.Eben, das beim Anklicken eines Buttons (bestehend aus einem Array)
immer die gleich Funktion aufgerufen wird, mit der Informations
des Elementindex.Werde mir den Link mal ansehen.
Gruss
-
Versuchs doch mal mit der QButtongroup.
-
Hi,
was macht den die Mapper Funktion,
wenn der Text auf den Buttons immer gleich ist ?signalMapper = new QSignalMapper(this); QGridLayout *gridLayout = new QGridLayout; for (int i = 0; i < texts.size(); ++i) { QPushButton *button = new QPushButton(texts[i]); connect(button, SIGNAL(clicked()), signalMapper, SLOT(map())); signalMapper->setMapping(button, texts[i]); gridLayout->addWidget(button, i / 3, i % 3); } connect(signalMapper, SIGNAL(mapped(const QString &)), this, SIGNAL(clicked(const QString &))); setLayout(gridLayout);
Wie hier in dem Beispiel zu sehen ist, muss man den Text des Button mit angeben.
Gruss
-
Also so ganz kenne ich mich damit ja nicht aus, aber da Du ja verschiedene Buttons hast, könntest Du die ja einfach durchnummerieren und anstelle eines String-Arrays dann eben ein Int-Array (oder ein String-Array mit Zahlen) übergeben und bei setmapping dann entsprechend nicht mit dem Buttontext verknüpfen. So hättest Du dann Deine unterscheidbaren Signale.
-
Es muss doch der ButtonText nicht der Identifier sein. Alle QObjects haben doch einen objectName(). Gestalte diesen eindeutig und verwende den. Oder halt ein int. Was du halt bei setMapping() angeben kannst.
QTAnfänger schrieb:
Also so ganz kenne ich mich damit ja nicht aus, aber da Du ja verschiedene Buttons hast, könntest Du die ja einfach durchnummerieren und anstelle eines String-Arrays dann eben ein Int-Array (oder ein String-Array mit Zahlen) übergeben und bei setmapping dann entsprechend nicht mit dem Buttontext verknüpfen. So hättest Du dann Deine unterscheidbaren Signale.
-
Da muss ich wohl erstmal was nachlesen.
Danke trotz allem für diese Infos.
Edit:
Jetzt habe ich die ganze Sache verstanden, der Mapper geht nur hin
und sendet den vorher vergebenen Ttext mit in die "Connect-Routine".Da biete es sich wirklich an, den Objectnamen in der Funktion anzugeben
und evtl. den Index in den Namen einzubinden.
Das kann man dann prima in der Routine auswerten.Gruss
-
So, jetzt habe ich eine Stunde gesucht, weil ich ebenso blind wie einige andere hier einfach copy'n'paste gemacht haben. Dann fiel's mir wie Schuppen von den Augen. In der Doku von Trolltech ist ein Fehler.
Statt
connect(signalMapper, SIGNAL(mapped(const QString &)), this, SIGNAL(clicked(const QString &)));
muss es nach der Schleife heißen
connect(signalMapper, SIGNAL(mapped(const QString &)), this, [b]SLOT[/b](clicked(const QString &)));
Ist ja auch logisch...