Anfängerproblem mit Signalen und Slots

Alles rund um die Programmierung mit Qt
Antworten
anton_dremel
Beiträge: 6
Registriert: 31. Mai 2008 17:05

Anfängerproblem mit Signalen und Slots

Beitrag von anton_dremel »

Hallo Leute,

ich versuche ein einfaches Beispiel zum Laufen zu bringen: das Ergebnis:
1. der Button openButton ist sichtbar
2. das connect liefert true, ich nehme also an, dass die Verbindung steht.
3. ABER: wenn ich den Button drücke, tut sich nichts, d.h opencounter() wird nicht aufgerufen (hab's auch im Debugger probiert).

Wie kann ich rausfinden, was schief läuft??


HEADER:

Code: Alles auswählen

#ifndef OPENCOUNTERDIALOG_H
#define OPENCOUNTERDIALOG_H

#include <QObject>
#include "ui_counter.h"


class QGroupBox;
class QPushButton;

class OpenCounterDialog : public QObject {
	Q_OBJECT

private:
	QPushButton* openButton;

public:
	OpenCounterDialog(QGroupBox* parent);

private slots:
	void opencounter();
};

#endif
IMPLEMENTIERUNG:

Code: Alles auswählen

#include <QtGui>
#include <QDebug>
#include "openCounter.h"
#include "counterdialog.h"

OpenCounterDialog::OpenCounterDialog(QGroupBox* parent) {
    openButton = new QPushButton(tr("&Open Counter Dialog"));
    QHBoxLayout *mainLayout = new QHBoxLayout;
    mainLayout->addWidget(openButton);
    mainLayout->addStretch();
    parent->setLayout(mainLayout);

	if (connect(openButton, SIGNAL(clicked()), this, SLOT(opencounter() )) ) {
		qDebug(" openButton connected ");
	}
}

void OpenCounterDialog::opencounter() {
	CounterDialog dialog;
	qDebug(" opencounter ");
	dialog.show();
}
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Ich seh jetzt keinen Grund warum der Slot nicht aufgerufen werden sollte, aber es sollte auf jeden Fall

Code: Alles auswählen

dialog.exec()
heißen.
anton_dremel
Beiträge: 6
Registriert: 31. Mai 2008 17:05

Beitrag von anton_dremel »

Danke für den Tipp, der aber das Grundproblem nicht löst.

Kann es daran hängen, dass OpenCounterDialog ein eigenes Objekt ist, dessen Widgets in einem anderen Dialog hängen?
ColonelMoW
Beiträge: 30
Registriert: 15. April 2008 16:24

Beitrag von ColonelMoW »

ruft er denn den slot garnicht auf?
Sprich auch das Debug(" opencounter ") wird nicht ausgefuehrt?
Schmeiss mal das "CounterDialog dialog" und das "dialog.exec()" raus.
Und schau, ob wenigstens die debug-Ausgabe durchkommt...

Ich habe zwar noch nicht mit dem Designer gearbeitet, aber ich habe mal gelesen, dass man auf jededenfall die setup_ui() aufrufen sollte bevor man mit der Klasse des designers arbeitet. Du hast doch den Dialog mit dem designer erstellt, oder?

Col
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Also ich sehe hier zwei was komisches
1. Du inkludierst ui_counter.h aber ich sehe nirgends das du es verwendest
2. Du leitest einen Dialog von QObject ab??
3. Du erzeugst ein OpenCounterDialog mit QGroupBox als parent? Was soll das überhaupt?
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
anton_dremel
Beiträge: 6
Registriert: 31. Mai 2008 17:05

Beitrag von anton_dremel »

Zu 1.
Korrekt, habe ich rausgemacht, macht aber keinen Unterschied.

Zu 2.
Ja, es gibt einen von QObject abgeleiteten Dialog. Dort wird eine GroupBox erzeugt und in ein Layout gehängt und an den Konstruktor von OpenCounterDialog übergeben.

Zu 3.
Naja, ich möchte, dass der Button Teil der übergebenen GroupBox wird, was im Ergebnis ja auch passiert.

Christian81 hat geschrieben:Also ich sehe hier zwei was komisches
1. Du inkludierst ui_counter.h aber ich sehe nirgends das du es verwendest
2. Du leitest einen Dialog von QObject ab??
3. Du erzeugst ein OpenCounterDialog mit QGroupBox als parent? Was soll das überhaupt?
anton_dremel
Beiträge: 6
Registriert: 31. Mai 2008 17:05

Beitrag von anton_dremel »

Habe alles ausser der Debugausgabe raus; hilft aber nicht, die Ausgabe kommt nur vom Connect, nicht beim Drücken.

Der OpenCounterDialog kommt nicht aus dem Designer, der CounterDialog schon.
ColonelMoW hat geschrieben:ruft er denn den slot garnicht auf?
Sprich auch das Debug(" opencounter ") wird nicht ausgefuehrt?
Schmeiss mal das "CounterDialog dialog" und das "dialog.exec()" raus.
Und schau, ob wenigstens die debug-Ausgabe durchkommt...

Ich habe zwar noch nicht mit dem Designer gearbeitet, aber ich habe mal gelesen, dass man auf jededenfall die setup_ui() aufrufen sollte bevor man mit der Klasse des designers arbeitet. Du hast doch den Dialog mit dem designer erstellt, oder?

Col
anton_dremel
Beiträge: 6
Registriert: 31. Mai 2008 17:05

Variation des Problems

Beitrag von anton_dremel »

Folgende Variation funktioniert auch nicht; sprich: die Debug-Ausgabe ist nicht zu sehen. Idee war hier, die GroupBox in der Klasse zu halten und über getBox rauszugeben.

Meine Vermutung ist ja, dass das Signal gar nicht ausgelöst wird, aber wie kann ich das überprüfen??


Code: Alles auswählen

#ifndef OPENCOUNTERDIALOG_H
#define OPENCOUNTERDIALOG_H

#include <QObject>

class QGroupBox;
class QPushButton;

class OpenCounterDialog : public QObject {
	Q_OBJECT

private:
	QPushButton* openButton;
	QGroupBox* box;

public:
	OpenCounterDialog();
	QGroupBox* getBox();

private slots:
	void opencounter();
};

#endif

Code: Alles auswählen

#include <QtGui>
#include <QDebug>
#include "openCounter.h"
#include "counterdialog.h"

OpenCounterDialog::OpenCounterDialog() {
	box = new QGroupBox(tr("Counter"));
    openButton = new QPushButton(tr("Dialog öffnen"));
    QHBoxLayout *mainLayout = new QHBoxLayout;
    mainLayout->addWidget(openButton);
    mainLayout->addStretch();
    box->setLayout(mainLayout);

	if (connect(openButton, SIGNAL(clicked()), this, SLOT(opencounter() )) ) {
		qDebug(" openButton connected ");
	}
}

QGroupBox* OpenCounterDialog::getBox() {
	return box;
}


void OpenCounterDialog::opencounter() {
	qDebug(" opencounter ");
//	CounterDialog dialog;
//	dialog.exec();
}

ColonelMoW
Beiträge: 30
Registriert: 15. April 2008 16:24

Beitrag von ColonelMoW »

Ich denke, dass dein Problem eine fehlende Event-Loop ist. Ich habe mir mal erlaubt dein Beispiel so nah wie moeglich zu modifizieren. Ist jetzt nicht wirklich schoen geworden, aber es laeuft:
openCounterDialog.h:

Code: Alles auswählen

#ifndef OPENCOUNTERDIALOG_H
#define OPENCOUNTERDIALOG_H

//#include <QObject>
#include <QDialog>

class QGroupBox;
class QPushButton;

//class OpenCounterDialog : public QObject {
class OpenCounterDialog : public QDialog {
   Q_OBJECT

private:
   QPushButton* openButton;
   QGroupBox* box;

public:
   OpenCounterDialog(QWidget *parent = NULL);
   QGroupBox* getBox();

private slots:
   void opencounter();
};

#endif
openCounterDialog.cpp

Code: Alles auswählen

#include <QtGui>
#include <QDebug>
#include "openCounterDialog.h"
//#include "counterdialog.h"

OpenCounterDialog::OpenCounterDialog(QWidget *parent) : QDialog(parent)
{
   box = new QGroupBox(tr("Counter"), this);
   openButton = new QPushButton(tr("Dialog öffnen"));
   QHBoxLayout *mainLayout = new QHBoxLayout;
   mainLayout->addWidget(openButton);
   mainLayout->addStretch();
   box->setLayout(mainLayout);
   
   if (connect(openButton, SIGNAL(clicked()), this, SLOT(opencounter() )) )
   {
      qDebug(" openButton connected ");
   }
}

QGroupBox* OpenCounterDialog::getBox()
{
   return box;
}


void OpenCounterDialog::opencounter()
{
   qDebug(" opencounter ");
//   CounterDialog dialog;
//   dialog.exec();
}
und eine main.cpp zum testen(!):

Code: Alles auswählen

#include <QApplication>
#include "openCounterDialog.h"

int main(int argc, char *argv[])
{
   QApplication app(argc, argv);
   
   OpenCounterDialog dialog;
   
   dialog.exec();
   
   return 0;
}
Ich haette das aber so in ein widget gepackt. Sprich Die Klasse von QWidget ableiten anstelle von QDialog. Habe es hier nur als Dialog gemacht, da du ja einen Dialog wolltest. Wenn du es als Widget realisierst, dann eben im main noch openCounterDialog.show() gefolgt von einem return app.exec().

Col
anton_dremel
Beiträge: 6
Registriert: 31. Mai 2008 17:05

QDialog nur aus einer Klasse?

Beitrag von anton_dremel »

Danke, aber mir scheint, wir reden noch aneinander vorbei. Deine Variante als eigenständiger, abgeleiteter Dialog funktioniert, aber wie hänge ich die erzeugte QGroupbox in einen anderen Dialog?

Anders gefragt: Kann ein Dialog nur aus einer Klasse bestehen, oder kann ich andere Elemente - hier eine GroupBox mit einem Button - in anderen Klasse definieren und einhängen? Das wollte ich mit diesem kleinen Test ausprobieren.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Was Du machst ist irgendwie... verwirrend.
Bau uns einen Testcase damit wir es kompilieren können und sehen was falsch läuft.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Antworten