Absturz durch QLineEdit

Alles rund um die Programmierung mit Qt
Antworten
wiedmann
Beiträge: 9
Registriert: 18. September 2006 10:37

Absturz durch QLineEdit

Beitrag von wiedmann »

Hallo Leute,

ich bin unter QT noch ein Anfänger, wobei ich ein paar Dinge schon mitbekommen habe, aber an diesem Problem sitze ich schon ein bisschen.

Und zwar habe ich ein Programm, bei dem man über die Settings einen Pfad angeben kann, mit dem das Programm arbeitet. Funktioniert ohne Probleme.

Allerdings habe ich in die Menüleiste jetzt eine QComboBox mit 2 Einträgen implementiert, womit je nach Auswahl der eine oder der andere Pfad verwendet werden soll. Bei diesem Pfad handelt es sich um die gleichen wie in den Settings, nur soll das ganze wesentlich Komfortabler werden damit man nicht in den Settings immer den Pfad angeben muss.

So nun mein Problem, ich habe mir gedacht, eigentlich könnte ich ja meinen Pfad nun genauso setzen wie das im Settingsmenü gemacht wird. Ich hab den Teil kopiert und eingefügt und jetzt das Problem. Wenn ich das Programm ausführe und einen Eintrag in der QComboBox auswähle stürzt mir das Programm ab. Die Daten die ich ändern möchte sind von der Klasse QLineEdit, ich habe bereits schon versucht daraus ein QTextEdit zu machen, blieb aber beim gleichen Ergebnis, das Programm ist abgestürzt. Mit dem Debugger habe ich bereits herausgefunden, dass das Programm immer an der Stelle abstürzt, an der ich die Daten der QLineEdit Klasse ändern möchte.

Nun noch ein Auszug aus dem Code damit ihr wisst, was ich geschrieben habe.

Code: Alles auswählen

QLineEdit *pathDaten
QSettings settings,

pathDaten->setText(settings.value("path/Daten").toString());  //Hier schmiert das Programm ab
Ich hoffe ihr könnt damit was anfangen, wäre super wenn ihr mir helfen könnt!

Grüße
tachyon
Beiträge: 29
Registriert: 22. Juli 2006 10:03

Beitrag von tachyon »

Du benutzt einen hängenden Zeiger für den noch kein konkretes Objekt existiert. Sprich, der Zeiger QLineEdit* zeigt zur Zeit ins Nirvana.

Du solltest es mal so probieren:

Code: Alles auswählen

QLineEdit* _qLineEdit = new QLineEdit;

MichaelS
Beiträge: 240
Registriert: 27. Dezember 2005 12:49

Beitrag von MichaelS »

Moin!

pathDaten ist ein Pointer, der nicht mit new initialisiert wurde und daher ins Nirwana zeigt. Darum führt der Zugriff auf die Methode setText() zum Absturz.

Gruß Michael
wiedmann
Beiträge: 9
Registriert: 18. September 2006 10:37

Beitrag von wiedmann »

Ja ok damit habt ihr recht, war ein Fehler von mir.

QLineEdit *pathDaten; ist ein einer Klasse unter Private definiert und somit hat es bereits Daten und zeigt nicht ins Nirvana. Die Funktion die ich geschrieben habe, ist Teil der gleichen Klasse, somit hat sie auch Zugriff drauf.
tachyon
Beiträge: 29
Registriert: 22. Juli 2006 10:03

Beitrag von tachyon »

Es ist egal, wo Du einen Zeiger deklarierst. Wenn Du ihn nicht an anderer Stelle definiertst (also auf einen definierten Speicherbereich zeigen läßt), dann kannst Du ihn nicht benutzen. Qt nimmt Dir zwar meist das Freigeben der Zeiger ab, aber um das Allokieren musst Du Dich schon selber kümmern.
Mach doch einfach mal das Asterisk (*) hinter QLineEdit weg. Ich schätze, dann wird es funktionieren.
wiedmann
Beiträge: 9
Registriert: 18. September 2006 10:37

Beitrag von wiedmann »

Denn kann ich leider nicht weg machen, weil der in anderen Teilen des Programms auch noch verwendet wird, dann müsste ich zu viel umschreiben.

Aber irgendwas stimmt da nicht, es steht ein paar Programmzeilen oberhalb genau die gleiche Funktion, auch ohne Übergabeparameter oder sonst was, absolut identisch, wenn ich aber die Funktion aufrufe passiert das gleiche. Mir kommt das so vor, als ob ich die Daten nicht nachträglich ändern darf oder so was, aber dass widerrum kommt mir sehr spanisch vor! Ich hoffe ich schreib hier nicht zu viele Fragezeichen und Unsinn. Aber ich steig da grad selber nicht durch warum und weshalb. Ich muss mir jetzt mal den Aufruf des anderen Teilprogramms anschauen (ist mir gerade in den Sinn gekommen), ob das was bringt.... mal sehen.
tachyon
Beiträge: 29
Registriert: 22. Juli 2006 10:03

Beitrag von tachyon »

Also, so wie ich Dich verstanden habe, benutzt Du QLineEdit in einer eigenen Klasse.
Ich mutmaße mal, das daß in etwa so aussieht:

Code: Alles auswählen

class CMyClass
{
    public:
    
    [...]
    void mySpecialFunction()
    {
        QSettings settings;
        [...]
        pathDaten->setText(settings.value("path/Daten").toString());
        [...]
    }
    
    private:
    
    [...]
    QLineEdit* pathDaten;
    [...]
}
Füge doch mal eine Initialisierung von pathDaten im Konstruktor deiner Klasse hinzu. Also in etwa folgendermaßen:

Code: Alles auswählen

    [...]
    public:    
    CMyClass()
    : pathDaten(new QLineEdit)
    {
        [...]
    }
wiedmann
Beiträge: 9
Registriert: 18. September 2006 10:37

Beitrag von wiedmann »

Genauso wie du es gerade geschrieben hast sieht es auch aus! Ich verstehs echt nicht.
Im Konstruktor ist die Variable mit dem new Befehl initalisiert.
tachyon
Beiträge: 29
Registriert: 22. Juli 2006 10:03

Beitrag von tachyon »

Gibt es beim Absturz irgendeine Fehlermeldung?
wiedmann
Beiträge: 9
Registriert: 18. September 2006 10:37

Beitrag von wiedmann »

Ich Programmier ja unter Suse Linux und KDevelop

Die einzigste Meldung die er mir bringt, ist "Prozesse abgeborchen. Segmentation faul"

Das ist die gleiche Meldung wie wenn ich während des ausführens den Anhalten Button drücke!
tachyon
Beiträge: 29
Registriert: 22. Juli 2006 10:03

Beitrag von tachyon »

Hmm, ein Segmentation Fault weist aber auf einen unitialisierten Zeiger hin. Probier doch mal folgendet. Hast Du im Debugger mal überprüft, ob Dein Zeiger auf einen gültigen Speicherbereich zeigt und nicht z.B. auf NULL? Vielleicht funktioniert ja schon bei der Allokation irgendwas nicht.

Edit: Ansonsten kannst Du mir ja evtl. Deine Klasse mal per PM schicken.
wiedmann
Beiträge: 9
Registriert: 18. September 2006 10:37

Beitrag von wiedmann »

Also der Pointer Zeigt auf Null, hab gerade noch mal nach geschaut. Mich wundert aber, dass die gleiche Funktion ein paar Zeilen drüber funktioniert.
tachyon
Beiträge: 29
Registriert: 22. Juli 2006 10:03

Beitrag von tachyon »

Tja, auf jeden Fall liegt der Absturz an dem NULL-Zeiger. Wieso der an der betroffenen Stelle auf NULL zeigt musst Du nun entweder selbst rausbekommen, oder Du schickst mir mal etwas mehr von dem Code. :wink:
wiedmann
Beiträge: 9
Registriert: 18. September 2006 10:37

Beitrag von wiedmann »

Problem ist nun behoben.

Mein Fehler lag beim Aufruf des Programms. Ich habe für den Aufruf der Funktion ein Objekt erstellt, dass allerdings zur Laufzeit der Funktion nicht mehr Aktiv war somit hat der Pointer auf NULL gezeigt und das Programm ist abgestürzt.

Der Fehler wurde behoben, indem ich ein neues Objekt mit new erzeugt und damit die Funktion aufgerufen habe.

Vielen Dank an tachyon!!!
Antworten