Seite 1 von 1
eigene slots definieren -- gelöst
Verfasst: 26. Februar 2007 23:15
von Linuxguru
hallo,
ich möchte per buttonklick den inhalt eines textlabels ändern.
allerdings gibt es kein vorgefertigtes ereignis für den receiver "label".
ich müsste praktisch einen eigenen slot definieren.
ich hab das ganze mal mit einem slider und einem lcd getestet, was auch perfekt funktioniert.
Code: Alles auswählen
QObject::connect(slider, SIGNAL(valueChanged(int)), lcd, SLOT(display(int)));
kann mir evtl jemand ein tip geben, wie ich mein problem mit dem textlabel so lösen kann?
danke
ps: wie kann ich gelöste beiträge auf gelöst setzen?
Verfasst: 26. Februar 2007 23:46
von heikob
Hallo Linuxguru,
ich versuche mal zu helfen. Eigentlich ist klar, dass du nicht direkt per Button ein Label ändern kannst. Wass sollte sich da auch ändert? Ein Button kannst du drücken, loslassen usw. Also nichts, was ein Label verstehen könnte.
Aber natürlich gibt es dafür eine Lösung. Ich versuche das mal ungeprüft zu formulieren:
Code: Alles auswählen
...
QButton *hello = new QButton("Hello Label");
connect ( hello, SIGNAL ( triggered() ), this, SLOT ( changeLabel() ) );
QLabel *helloLabel = new QLabel();
...
void changeLabel()
{
helloLabel->setText("Hello Button");
}
Edit: Natürlich musst du den Slot im Header unter "private slots:" hinzufügen damit es funktioniert. (Kann je nach Anwendungsfall auch protected oder public slot sein, aber in dem Beispiel ist private slot die beste Wahl).
Mehr ist das gar nicht.
Den Beitrag kannst du auf gelöst setzen, indem du den ersten beitrag editierst und die Überschrift entsprechend änderst.
Ich hoffe, ich konnte dir helfen
HeikoB
hallöchen
Verfasst: 27. Februar 2007 00:32
von Linuxguru
danke für die antwort..
hat mich schon ein wenig voran gebracht.
ich geh mal davon aus, das die funktion ausserhalb der int main funktion aufgerufen wird.
zumindest funktionieren beide nicht ganz.
innerhalb der main funktion bekomme ich ein fehler, dass die funktion nicht innerhalb einer funktion aufgerufen werden kann.
ausserhalb kann er dann logischerweisse mit dem label nix anfangen..
hier nochmal mein code
Code: Alles auswählen
int main......
{
QLabel *label = new QLabel(window);
label->setText("ich bin so gut!");
label->setGeometry(0, 40, 200, 50);
label->setAlignment(Qt::AlignCenter);
label->setFont(QFont("Arial", 20, QFont::Bold));
QPushButton *button1 = new QPushButton(window);
button1->setText("change");
button1->setGeometry(10, 110, 180, 30);
QObject::connect(button1, SIGNAL(clicked()), label, SLOT(changeLabel));
}
void changeLabel()
{
label->setText("Hello Button");
}
danke für die hilfe
Verfasst: 27. Februar 2007 00:42
von heikob
Ich dachte jetzt nicht, dass du das in der main ausführen möchtest, da dies unüblich ist. In meiner Mein steht in der Regel nur sowas wie:
Code: Alles auswählen
int main ( int argc, char *argv[] )
{
QApplication app ( argc, argv );
MainWindow mainWin;
mainWin.show();
return app.exec();
}
Im MainWindow funktioniert das dann wunderbar. In der main habe ich das nich nicht getestet. Unter was entwickelst du? Unter KDevelop gibt es ein gutes Template, dass ich dir gerne zur Verfügung stellen kann. Da sind die Grundelemente bereits implementiert.
Verfasst: 27. Februar 2007 01:14
von heikob
Nochmal Hallo,
ich habe dir eine PN mit einem Beispiel geschickt. Ich hoffe, dass es damit klarer wird, was ihc meine. Bei Fragen kannst du dich gerne bei mir melden.
HeikoB
Verfasst: 27. Februar 2007 16:28
von upsala
Damit man Signale und Slots verwenden kann braucht man eine Klasse, die von QObject abgeleitet ist (steht in der Dokumentation zu
Signals and Slots). Das heißt aber nicht, daß man dein Problem nicht umsetzen könnte:
Code: Alles auswählen
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
QLabel *label = new QLabel("irgendwas");
label->setGeometry(0, 40, 200, 50);
label->setAlignment(Qt::AlignCenter);
label->setFont(QFont("Arial", 20, QFont::Bold));
QPushButton *button1 = new QPushButton("change");
button1->setGeometry(10, 110, 180, 30);
QSignalMapper *mapper=new QSignalMapper(0);
QObject::connect(mapper, SIGNAL(mapped(const QString &)), label, SLOT(setText(const QString &)));
QObject::connect(button1, SIGNAL(clicked()), mapper, SLOT(map()));
mapper->setMapping(button1, "Hello Button");
app.exec();
}
Verfasst: 28. Februar 2007 23:24
von Linuxguru
super..
die letzten beispiele haben das ganze mal verständlich gemacht.. danke euch allen!!!