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

Alles rund um die Programmierung mit Qt
Antworten
Gorion
Beiträge: 12
Registriert: 29. Mai 2009 13:10
Kontaktdaten:

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

Beitrag 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
Zuletzt geändert von Gorion am 11. September 2009 08:16, insgesamt 1-mal geändert.
archer
Beiträge: 306
Registriert: 2. Februar 2006 09:56

Beitrag von archer »

Hast du vielleicht vergessen den Übergabeparameter in
KlingelFeldHandling(KlingelFeld*) der Variable myFeld zuzuweisen?
Gorion
Beiträge: 12
Registriert: 29. Mai 2009 13:10
Kontaktdaten:

Beitrag 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
chrislo1976
Beiträge: 105
Registriert: 24. Februar 2008 09:45

Beitrag 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
pfid
Beiträge: 535
Registriert: 22. Februar 2008 16:59

Re: Änderung eines GUI-Objektes in ausgelagerter Klasse

Beitrag 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 ;)
Gorion
Beiträge: 12
Registriert: 29. Mai 2009 13:10
Kontaktdaten:

Beitrag von Gorion »

AUTSCH!!!! Böses Aua Weh-Weh!!

Danke Leute vielen Dank ;)
Gorion
Beiträge: 12
Registriert: 29. Mai 2009 13:10
Kontaktdaten:

Beitrag von Gorion »

Konstruktor geändert und funktioniert:

Code: Alles auswählen


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


Danke nochmals :)
Antworten