Seite 1 von 1

SIGNAL & SLOT will einfach nicht funktionieren

Verfasst: 10. Dezember 2008 09:51
von boesewicht
Hallo,

ich habe eine kleine Klasse geschrieben, in der ich mit einem Quit-Button das Fenster schließen möchte. Der slot wird aber einfach nicht aufgerufen. Kann mir jemand bitte helfen?

Code:

Code: Alles auswählen

#include <QtGui>
#include "show.h"

presence::presence(QWidget *parent):QDialog(parent)
{
    todayLabel = new QLabel(tr("&today:"));
    todayLineEdit = new QLineEdit;
    todayLabel->setBuddy(todayLineEdit);
    loadPushButton = new QPushButton(tr("&load"));
    quitPushButton = new QPushButton(tr("&quit"));

    // connect:
    connect(quitPushButton, SIGNAL(clicked()), this, SLOT(quit()));
    //connect(loadPushButton, SIGNAL(clicked()), this, SLOT(load_date()));

    // layout:
    QHBoxLayout *todayLayout = new QHBoxLayout;
    todayLayout->addWidget(todayLabel);
    todayLayout->addWidget(todayLineEdit);
    todayLayout->addWidget(loadPushButton);
    todayLayout->addWidget(quitPushButton);

    // show widgets:
    setLayout(todayLayout);
}

Verfasst: 10. Dezember 2008 09:58
von AuE
was liefert connect? schau mal in die Ausgabe!
geht das connect ne zeile tiefer?

Verfasst: 10. Dezember 2008 13:47
von nando
Hast du im Headerfile das Q_OBJECT Makro geschrieben?


Gruss,
Nando

Verfasst: 10. Dezember 2008 16:17
von boesewicht
@nando:
Ja, das Q_OBJECT Makro habe ich eingefügt.

@AuE:
das connect darunter geht leider ebenfalls nicht. Eine Ausgabe sehe ich leider nicht (zumindest weiß ich nicht wo. bin noch zu sehr Anfänger).

Ich würde auch gerne in den Konstruktor der Klasse hinein debuggen, was aber anscheinend nicht möglich ist. Ich kann lediglich nur die main() debuggen.

Verfasst: 10. Dezember 2008 16:56
von Christian81
nando hat geschrieben:Hast du im Headerfile das Q_OBJECT Makro geschrieben?
... und ist der Slot auch wirklich als Q_SLOT definiert
QObject::connect() hat außerdem einen Rückgabewert welchen man auswerten kann

Verfasst: 11. Dezember 2008 07:15
von AuE
und wenn was schief geht kommt zusätlich ne Ausgabe in std::error ... also DosBox(falls diese beim prog mit aufgeht) oder die compilerausgabe....

SIGNAL & SLOT will einfach nicht funktionieren

Verfasst: 11. Dezember 2008 16:03
von sowas
wie folgt ändern:
connect(quitPushButton, SIGNAL(clicked()), this, SLOT(close()));
oder
connect(quitPushButton, SIGNAL(clicked()), qApp, SLOT(quit()));
weil
presence = QDialog keine Quit() Funktion hat
siehe auch bei Qt::WA_QuitOnClose nach

Verfasst: 11. Dezember 2008 17:33
von boesewicht
Danke für eure Hilfe.

Wenn ich den Code vom sowas verwende, funktioniert der quit-Button.
connect(quitPushButton, SIGNAL(clicked()), this, SLOT(close()));
bzw.
connect(quitPushButton, SIGNAL(clicked()), qApp, SLOT(quit()));

Ich dachte die von mir verwendete Funktion quit() würde es bereits in Qt geben.


Wenn es also nur an den falschen Aufruf von quit() gelegen hat, dann verstehe ich nicht warum mein connect(loadPushButton, SIGNAL(clicked()), this, SLOT(load_date())); darunter nicht ausgeführt wird, wenn ich ihn wieder auskommentiere.

Ich habe die load_date()-Funktion in der gleichen Datei in der der Konstruktor definiert ist. In der Hoffnung dass es hilfreich ist, füge ich hier mal meinen restlichen Code hinzu.

*.h

Code: Alles auswählen

#include <QtGui>
#include <QDialog>

class presence : public QDialog
{
    Q_OBJECT

public:
	presence(QWidget *parent =0);
	void load_date(void);

private:

	QLabel *todayLabel;
	QLineEdit *todayLineEdit;
	QPushButton *loadPushButton;
	QPushButton *quitPushButton;
};
der Rest von *.cpp

Code: Alles auswählen

void presence::load_date()
{
    QDate currentDate;
    QTime currentTime;

    currentDate = QDate::currentDate();
    currentTime = QTime::currentTime();

    //todayLineEdit->clear();
    todayLineEdit->setText("text");


    //currentDate.toString
    //todayLineEdit.paste("aaa");
}

Verfasst: 11. Dezember 2008 17:43
von boesewicht
Ahh... jetzt lichtet sich das ganze ein wenig :)

Ich habe für meine Funktion, die im SLOT() aufgerufen werden soll nicht beachtet, dass ich sie dann in der *.h-Datei auch unter private slots: deklarieren muss.
Jetzt funktioniert alles wunderbar.


Nur das debugen (in den Funktionen / im Konstruktor) geht nicht. Nur in der main-Funktion.
Ist das generell nicht möglich, oder fehlen mir nur irgendwelche Einstellungen in Eclipse?

Verfasst: 11. Dezember 2008 17:45
von solarix
dann verstehe ich nicht warum mein connect(loadPushButton, SIGNAL(clicked()), this, SLOT(load_date())); darunter nicht ausgeführt wird, wenn ich ihn wieder auskommentiere.
Meine Güte... es kann doch nicht so schwer sein, die Doku "http://doc.trolltech.com/4.4/signalsand ... ll-example" zu lesen und den offensichtlichen Fehler zu korrigieren...

Zwei Hinweise:
1. Was hat Christian81 schon lange gefragt (und du noch keine Antwort geliefert)

2. In welchem Abschnitt befindet sich der slot "void setValue(int value);" im Beispiel des obigen Links? Und in welchem Abschnitt befindet sich DEIN slot?

[Edit]
aha..etwas zu spät ;)