Seite 1 von 1

Übergebene Variable in MessageBox!

Verfasst: 28. Februar 2008 22:21
von zer0
Warum geht das nicht?

ich habe eine Klasse myButton
in dieser Klasse habe ich zwei Slots definiert:

Code: Alles auswählen

//myButton.h
class myButton : public QPushButton {
Q_OBJECT


public:
myButton();


public slots:
void nachricht();
void plop(const QString i);
};
void nachricht() funktioniert! Aber plop nicht:


Code: Alles auswählen

//myButton.cpp
void myButton::plop(QString i)
{
	QMessageBox::information(0,"Nachricht", i, QMessageBox::Ok);
}
Das Signal wird beim Button klick so ausgeführt:

Code: Alles auswählen

QObject::connect( play, SIGNAL( clicked() ),
                          play, SLOT( plop("Hallo Welt") ) );
Mein KDevelop sagt mir aber zur Laufzeit:

Code: Alles auswählen

Object::connect: No such slot myButton::plop("Hallo Welt")
Wenn ich auf den Button klicke passiert gar nichts!

Woran liegt das? :?:

Re: Übergebene Variable in MessageBox!

Verfasst: 28. Februar 2008 22:30
von Christian81
zer0 hat geschrieben: Woran liegt das? :?:
1. Sich nicht wirklich mit Signals und Slots beschäftigt
2. Die Foren-Suche auch nicht bemüht

http://doc.trolltech.com/4.3/signalsandslots.html

Verfasst: 28. Februar 2008 22:30
von upsala
Object::connect: No such slot myButton::plop("Hallo Welt")
Die Fehlermeldung ist aussagekräftig genug, eigne dir die Grundlagen von Signals und Slots an...

Verfasst: 28. Februar 2008 22:45
von zer0
super Hilfe!

Wenn ich es wüsste würde ich nicht fragen!
Noob-freundlich ist das Forum gar nicht!

Verfasst: 28. Februar 2008 22:51
von Christian81
Wenn wir sehen dass sich Leute wirklich selbst etwas informieren und nicht einfach drauflosfragen, helfen wir gerne. Des weiteren habe ich erstens schon einen Hinweis gegeben und zweitens einen Link gepostet wo alles ordentlich steht - besser kann ich es auch nicht erklären.

Verfasst: 29. Februar 2008 12:53
von zer0
Für jeden Anfänger der die Antwort auf die Frage sucht sollte sich folgendes merken:

In einem connect müssen die aufgerufenen Funktionen die gleichen werte haben. das heißt, wenn ich Signal leer lasse also so () , dann kann ich nicht im SLOT (QString) nehmen. Es gibt noch ein paar andere Regeln, aber die tun in diesem Beispiel nichts zur Sache.

Ich habe das ganze jetzt so gemacht:

Habe das Textfeld mit:

Code: Alles auswählen

QObject::connect( text, SIGNAL(textChanged(QString)),
			  button, SLOT(setQString(QString)) );
QObject::connect( play, SIGNAL( clicked() ),
                          play, SLOT( tuwas() ) );
Musste also einen Slot für myButton schreiben:

Code: Alles auswählen

//myButton.h

private:
QString merke;

public slots:
void setQString(QString m_i);
void tuwas();
Dann in der myButton.cpp

Code: Alles auswählen

void myButton::setQString(QString m_i)
{
	merke = m_i;
}

void tuwas() {
//irgendwas ausführen und die Variable merke verwenden z.B.:
QMessageBox::information(0,"Info",merke,QMessageBox::Ok);
}
Supi! Jetzt kann das ganze als gelöst markiert werden.

Verfasst: 29. Februar 2008 12:59
von Christian81
zer0 hat geschrieben: Supi! Jetzt kann das ganze als gelöst markiert werden.
Das kannst Du selbst :)

Nochwas: Meist ist es sinnvoller die Objekte als const reference zu übergeben -> plop(const QString &). Dem connect ist das aber egal - dort kann man weiterhin SLOT(plop(QString)) ) stehen

Verfasst: 29. Februar 2008 14:37
von zer0
Wahrscheinlich hast du recht, dann sind die Variablen eine Konstante und können nicht mehr geändert werden.

Supi! :D