Signal/Slots Anfängerproblem

Verschiedenes zu Qt
Antworten
nierth
Beiträge: 30
Registriert: 19. November 2008 22:56

Signal/Slots Anfängerproblem

Beitrag 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
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Nicht initalisierter Pointer, genaueres sagt dir dein Debugger.
nierth
Beiträge: 30
Registriert: 19. November 2008 22:56

Beitrag von nierth »

danke, dass weiss ich.

EDIT: stimmt zumindest das oben erwähnte Konstrukt? Dann lässt sich der Fehler eingrenzen
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Am obigen Code ist kein Fehler zu erkennen.
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag 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); 
nierth
Beiträge: 30
Registriert: 19. November 2008 22:56

Beitrag 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
Ginsengelf
Beiträge: 79
Registriert: 2. Mai 2007 10:21

Beitrag 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
nierth
Beiträge: 30
Registriert: 19. November 2008 22:56

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