Seite 1 von 1
Anfängerproblem mit Signalen und Slots
Verfasst: 31. Mai 2008 17:22
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();
}
Verfasst: 31. Mai 2008 17:56
von upsala
Ich seh jetzt keinen Grund warum der Slot nicht aufgerufen werden sollte, aber es sollte auf jeden Fall
heißen.
Verfasst: 31. Mai 2008 18:14
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?
Verfasst: 31. Mai 2008 18:52
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
Verfasst: 31. Mai 2008 20:20
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?
Verfasst: 1. Juni 2008 19:53
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?
Verfasst: 1. Juni 2008 20:03
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
Variation des Problems
Verfasst: 1. Juni 2008 20:11
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();
}
Verfasst: 2. Juni 2008 14:20
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
QDialog nur aus einer Klasse?
Verfasst: 3. Juni 2008 19:48
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.
Verfasst: 3. Juni 2008 19:51
von Christian81
Was Du machst ist irgendwie... verwirrend.
Bau uns einen Testcase damit wir es kompilieren können und sehen was falsch läuft.