Seite 1 von 1

SIGNAL(), SLOT() - warum gleiche Parameter? (Anfängerfrage)

Verfasst: 21. Februar 2007 17:41
von valenterry
Hallo erstmal an alle, bin ganz neu hier.
Ich hab mir das Buch "C++ GUI Programmierung mit QT4" gekauft.
In diesem gibt es folgendes Codebeispiel:

Code: Alles auswählen

#include <QApplication>
#include <QPushButton>

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    QPushButton *button = new QPushButton("Quit");
    QObject::connect(button, SIGNAL(clicked()),
                     &app, SLOT(quit()));
    button->show();
    return app.exec();
}
Ich hab das ein bisschen modifiziert und folgendes ist dabei rausgekommen:

Code: Alles auswählen

#include <QApplication>
#include <QPushButton>

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
	
	QWidget *mainWindow = new QWidget;
	
	mainwindow->setWindowTitle("erster Titel");
	
    QPushButton *quitButton = new QPushButton("Beenden");
	QPushButton *titelButton = new QPushButton("Titel aendern");
	
    QObject::connect(quitButton, SIGNAL(clicked()),
                     &app, SLOT(quit()));
    QObject::connect(titelButton, SIGNAL(clicked()),
                     mainwindow, SLOT(setWindowTitle("neuer Titel")));

	mainwindow->show();
	
    return app.exec();
}
Wenn ich das nun kompiliere, ausführe und auf den titelButton klicke, passiert nix. Eigentlich sollte das Fenster nun die Überschrift "neuer Titel" haben.
Ich habe auch andere Methoden ausprobiert, z.B. die Fenstergröße zu ändern, oder den Text des quitButtons zu ändern, aber nichts hat funktioniert.
Dann hab ich in folgendem Tutorial gelesen, dass die SIGNAL Methode und die SLOT Methode jeweils den gleichen Parameter haben müssen.
Stimmt das und funktioniert mein Beispiel deshalb nicht, oder liegt es (auch noch) an etwas anderem?
Falls es daran liegt, was kann ich tun, damit es trotzdem funktioniert, ohne große Umwege gehen zu müssen?
Achja, falls ihr noch mehr Infos braucht, lasst es mich wissen.
Bitte helft einem verzweifelten Neuling. >.<

Greets, valenterry.

Verfasst: 21. Februar 2007 17:54
von upsala
Doku schon gelesen? Signals and Slots

Verfasst: 21. Februar 2007 18:12
von valenterry
Ja hab ich schon gelesen.
Qt's signals and slots mechanism ensures that if you connect a signal to a slot, the slot will be called with the signal's parameters at the right time. Signals and slots can take any number of arguments of any type. They are completely type safe.
Meintest du speziell diesen Abschnitt?
Das hilft mir aber auch nicht wirklich.

Verfasst: 21. Februar 2007 18:24
von upsala
Nein diesen:
The signature of a signal must match the signature of the receiving slot. (In fact a slot may have a shorter signature than the signal it receives because it can ignore extra arguments.)

Verfasst: 21. Februar 2007 19:42
von valenterry
Also war meine Vermutung ja doch richtig und ich kann nicht "clicked()" und "setWindowTitle()" benutzen, weil "clicked()" keine Parameter hat aber "setWindowTitle()" schon. Stimmt das jetzt so?
Und meine Frage dazu war nun, ob ich den Namen des Fenster nun elegant ändern kann (und wenn ja, wie es geht), oder ob ich mir dafür eine Funktion schreiben muss.

Verfasst: 21. Februar 2007 19:57
von upsala
Ja, du mußt dir dazu eine eigene Funktion schreiben (bzw. eigentlich einen SLOT). Da man QMainWindow aber meist in einer selbst abgeleiteten Klasse verwendet fallen die 2 Zeilen Code auch nicht auf. Es würde zwar in deiner Test-Main-Klasse auch gehen aber Aufwand dafür steht in keinem Verhältnis zum Ergebnis...

Verfasst: 21. Februar 2007 20:04
von valenterry
Gut, danke für deine Hilfe! :D