Seite 1 von 1

[gelöst] Änderung eines GUI-Objektes in ausgelagerter Klasse

Verfasst: 9. September 2009 14:43
von Gorion
Hallo Forum,

Ich habe ein Problem mit einem Slotaufruf in einer handling-Klasse, die für mich Elemente einer gui verändern soll.

Ich habe meine Basisklasse so angelegt:

Code: Alles auswählen

#ifndef KLINGELFELD_H
#define KLINGELFELD_H
#include <QString>
#include <QObject>
#include <QTcpServer>
#include <QString>
#include "ui_KlingelFeld.h"
#include "klingelfeldxml.h"
#include "klingelfeldhandling.h"


class KlingelFeld : public QMainWindow, public Ui::KlingelFeld
{
    Q_OBJECT

public:
    KlingelFeld(QMainWindow *parent = 0);
    ~KlingelFeld();
    void readXML();

public slots:
    void displaySockError(int socketError, const QString &message);
    void newText(const QString &labText);
    void startClientConnection();
    void readSocket();
    void selectHandle(QString handle);

signals:
    void error(int socketError, const QString &message);
    void getText(const QString &text);
    void sigshowABC();
    void sigshowNum();
    void sigScrollAbcDown();

private:
    Ui::KlingelFeld ui;
    QString address;
    quint16 port;
    int socketDescriptor;
    QTcpServer Server;
    QTcpSocket *client;
    KlingelFeldXML *xmlData;


};

#endif
Die Handling Klassendefinition sieht wie folgt aus:

Code: Alles auswählen

#ifndef KLINGELFELDHANDLING_H
#define KLINGELFELDHANDLING_H

#include <QObject>
#include <QString>

#include "klingelfeldxml.h"
#include "KlingelFeld.h"
#include "klingelfelddata.h"

class KlingelFeld;

class KlingelFeldHandling : public QObject
{
    Q_OBJECT

    KlingelFeld *myFeld;

public:
    KlingelFeldHandling(KlingelFeld*){}
    ~KlingelFeldHandling(){}

public slots:
    void abcScrollDown();


};

#endif // KLINGELFELDHANDLING_H
Ich lege im Konstruktor der Basisklasse ein Objekt der Handling-Klasse an und verbinde das Signal void sigScrollAbcDown(); mit dem Slot void abcScrollDown:

Code: Alles auswählen

KlingelFeld::KlingelFeld(QMainWindow *parent)
     : QMainWindow(parent)
{
    setupUi(this);
    KlingelFeldHandling *handling = new KlingelFeldHandling(this);
    ....
    ....
 connect(this,SIGNAL(sigScrollAbcDown()),handling,SLOT(abcScrollDown()));

Dann will ich im Slot selbst ein Textlabel der ui ändern:

Code: Alles auswählen

void KlingelFeldHandling::abcScrollDown(){
    myFeld->nameLab_1->setText("Michael");
}
Kompiler meckert nicht und sonst läuft mein Programm supi aber wenn dieser slot ausgelöst wird stürzt das Programm ohne Rückmeldung einfach ab.
Woran kann das liegen? Greife ich auf irgendwelche falschen Speicherbereiche zu?
Vielen Dank :)
Mfg Gorion

Verfasst: 9. September 2009 15:43
von archer
Hast du vielleicht vergessen den Übergabeparameter in
KlingelFeldHandling(KlingelFeld*) der Variable myFeld zuzuweisen?

Verfasst: 9. September 2009 16:51
von Gorion
myFeld deklariere ich ja in der Handling Klasse:

Code: Alles auswählen

#ifndef KLINGELFELDHANDLING_H
#define KLINGELFELDHANDLING_H

#include <QObject>
#include <QString>

#include "klingelfeldxml.h"
#include "KlingelFeld.h"
#include "klingelfelddata.h"

class KlingelFeld;

class KlingelFeldHandling : public QObject
{
    Q_OBJECT

    KlingelFeld *myFeld; <---- Deklaration myFeld!!

public:
    KlingelFeldHandling(KlingelFeld*){}
    ~KlingelFeldHandling(){}

public slots:
    void abcScrollDown();


};

#endif // KLINGELFELDHANDLING_H 
myFeld ist vom Typ der Klasse KlingelFeld. Habe ich da jetzt was übersehen? Muss ich QMainWindow mitübergeben??

Gorion

Verfasst: 9. September 2009 17:43
von chrislo1976
Hallo!
myFeld ist vom Typ der Klasse KlingelFeld
Ist so nicht ganz richtig. Vielmehr ist myFeld ein Zeiger der auf ein Objekt vom Typ KlingelFeld zeigt.

Wenn du diesen Zeiger nicht initialisierst, zeigt dieser initial auf irgendeinen Speicherbereich. Und wenn du dann diesen Zeiger mit

Code: Alles auswählen

myFeld->...
verwendest, endet das in einer Zugriffsverletzung.

Ich denke (wie archer auch) dass du im Konstruktor von KlingelFeldHandling einfach vergessen hast den Zeiger mit dem Parameter zu belegen...

HTH
Christian

Re: Änderung eines GUI-Objektes in ausgelagerter Klasse

Verfasst: 10. September 2009 08:11
von pfid
Gorion hat geschrieben:
Ich lege im Konstruktor der Basisklasse ein Objekt der Handling-Klasse an und verbinde das Signal void sigScrollAbcDown(); mit dem Slot void abcScrollDown:
Das stimmt übrigens auch nicht; die KlingelFeld-Klasse ist nicht die Basisklasse der Handling-Klasse ;)

[edit]

Und wie schon vermutet wurde:

Code: Alles auswählen

KlingelFeldHandling(KlingelFeld*){} 
Wenn dein Konstruktor leer ist, wird dort auch kein KlingelFeld-Pointer initialisiert ;)

Verfasst: 10. September 2009 08:51
von Gorion
AUTSCH!!!! Böses Aua Weh-Weh!!

Danke Leute vielen Dank ;)

Verfasst: 11. September 2009 08:15
von Gorion
Konstruktor geändert und funktioniert:

Code: Alles auswählen


KlingelFeldThread::KlingelFeldThread(KlingelFeld *feld) : myFeld(feld){}


Danke nochmals :)