Seite 1 von 1

Signal/Slots Anfängerproblem

Verfasst: 5. Januar 2009 20:30
von nierth
Hallo,

tjo, eigentlich habe ich nur versucht Signale und Slots mit Übergabeparametern zu erstellen, herausgekommen ist ein komisches Konstrukt aus dem ich nicht ganz schlau werde. Grundidee bei meiner Anordnung ist die, das durch Drücken eines Knopfes in der GUI in einer anderen Klasse ein Flag gesetzt wird - was allerdings nicht ganz funktioniert, teilweise bricht das Programm mit Segmentation Faults ab, teilweise ändert es den Wert einfach nicht um:

Code in der einen Funktion:
QPushButton *manualOverride = new QPushButton("Manual Override",this);
manualOverride->setCheckable(true);
connect(manualOverride, SIGNAL(clicked()), this, SLOT(manualClicked()));
void GuiButtonBar::manualClicked() {
emit pressedManual(manualOverride->isChecked());
}

meine zentrale Verbindungsklasse (hat Zugriff auf alle Klassen die Signale/Slots benutzen):
connect(buttonBar, SIGNAL(pressedManual(bool)), display, SLOT(doManualOverride(bool)));

und noch in der anderen Klasse (in der es die boolsche Variable manualOverride gibt):
void GuiDisplay::doManualOverride(bool input) {
manualOverride = input;
}
Danke schon im Voraus,

Thomas

Verfasst: 5. Januar 2009 20:34
von upsala
Nicht initalisierter Pointer, genaueres sagt dir dein Debugger.

Verfasst: 5. Januar 2009 20:53
von nierth
danke, dass weiss ich.

EDIT: stimmt zumindest das oben erwähnte Konstrukt? Dann lässt sich der Fehler eingrenzen

Verfasst: 5. Januar 2009 21:51
von upsala
Am obigen Code ist kein Fehler zu erkennen.

Verfasst: 5. Januar 2009 22:28
von solarix
ausser natürlich, dass die Variabel "manualOverride"

Code: Alles auswählen

void GuiButtonBar::manualClicked() {
emit pressedManual(manualOverride->isChecked());
}
nicht dieselbe sein kann, wie im Konstruktor(?) hier:

Code: Alles auswählen

QPushButton *manualOverride = new QPushButton("Manual Override",this);
manualOverride->setCheckable(true); 

Verfasst: 6. Januar 2009 15:46
von nierth
nein, die Variablen sind nicht dieselben. Bei der einen handelt es sich um einen QPushButton, bei der anderen um eine boolsche Variable. Immerhin konnte ich den Fehler darauf eingrenzen, dass das Programm immer abstürzt wenn ich "isChecked" aufrufe. Umgehe ich dies und übergebe im Signal einfach ein "true" ist alles in Ordnung.

konkret:
QPushButton *manualOverride = new QPushButton("Manual Override",this);
manualOverride->setCheckable(true);
connect(manualOverride, SIGNAL(clicked(bool)), this, SLOT(manualClicked(bool)));
void GuiButtonBar::manualClicked(bool checked) {
emit pressedManual(checked);
}
funktioniert

Liegt es daran dass clicked(bool) bereits denn boolschen Wert mit sich zieht, ich diesen aber in erstem Beispiel nicht verarbeite?

Thomas

Verfasst: 6. Januar 2009 16:09
von Ginsengelf
Woraus solarix hinauswollte, ist, dass du manualOverride anlegst (new QPushButton), der wahrscheinlich eine Membervariable einer Klasse werden soll, aber eine lokale Variable wird. In manualClicked() wird dann auf die Membervariable zugegriffen, die natürlich nicht initialisiert ist (weil manualOverride ja lokal angelegt worden und der Zeiger darauf "verloren" worden war), und darum gibt es den Speicherzugriffsfehler.

Ginsengelf

Verfasst: 7. Januar 2009 21:35
von nierth
danke, lag wirklich an dem von solarix beschriebenen Problem: Ich habe im Konstruktor der Klasse nochmal ein Objekt vom selben Namen wie die membervariable erstellt!

Thomas