SIGNAL & SLOT will einfach nicht funktionieren

Alles rund um die Programmierung mit Qt
Antworten
boesewicht
Beiträge: 8
Registriert: 9. Dezember 2008 18:57

SIGNAL & SLOT will einfach nicht funktionieren

Beitrag 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);
}
AuE
Beiträge: 918
Registriert: 5. August 2008 10:58

Beitrag von AuE »

was liefert connect? schau mal in die Ausgabe!
geht das connect ne zeile tiefer?
nando
Beiträge: 321
Registriert: 28. Oktober 2004 13:16

Beitrag von nando »

Hast du im Headerfile das Q_OBJECT Makro geschrieben?


Gruss,
Nando
boesewicht
Beiträge: 8
Registriert: 9. Dezember 2008 18:57

Beitrag 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.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag 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
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
AuE
Beiträge: 918
Registriert: 5. August 2008 10:58

Beitrag 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....
sowas
Beiträge: 105
Registriert: 19. September 2006 16:02

SIGNAL & SLOT will einfach nicht funktionieren

Beitrag 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
boesewicht
Beiträge: 8
Registriert: 9. Dezember 2008 18:57

Beitrag 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");
}
boesewicht
Beiträge: 8
Registriert: 9. Dezember 2008 18:57

Beitrag 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?
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag 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 ;)
Antworten