Seite 1 von 1

Problem mit QT 3.3.1 (gelöst)

Verfasst: 8. Februar 2007 15:58
von patrickp
Hallo zusammen,

ich habe ein Problem in einem QT Programm, bei dem ich nicht weiter komme. Vielleicht kann mir hier jemand auf die Sprünge helfen?

Ich habe folgende Kalsse implementiert.

Code: Alles auswählen

#include <qwidget.h>
#include <qlayout.h>
#include <qlabel.h>
#include <qtextedit.h>
#include <qstring.h>
#include "centralwidget.h"

lcfCentralWidget::lcfCentralWidget( QWidget *parent, const char *name )
    : QWidget( parent, name )
{
    
        QGridLayout *mainGrid = new QGridLayout(this,2,1,5,-1);
	
	QLabel *stressFileLabel = new QLabel("Stress Input File: ",this);
 	cout << stressFileLabel << endl;
	stressFileLabel->setText("neuER Text");
	cout << stressFileLabel << endl;
	updateStressInput("HAllo");
	
	QTextEdit *textwindow = new QTextEdit(this); 
        textwindow->setReadOnly(true);
	textwindow->setText("LCF-life Evaluation Tool Version 0.1");
	textwindow->append("(Early Development Stage)");

	mainGrid->addWidget(stressFileLabel,1,0);
	mainGrid->addWidget(textwindow,2,0);

}

void lcfCentralWidget::updateStressInput(const QString filename)
{
	QString msg="Stress Input File: ";
	msg= msg + filename;
	cout << stressFileLabel << endl;
	stressFileLabel->setText(filename);
	cout << "test" << msg.ascii() <<  endl;
	return;
}
//

Die Klasse wird in einem
QT-Mainwindow Programm als Central Widget benutzt. Leider stürzt das Prog
zur Laufzeit mit einem Memory Fault aus.

Wenn ich den Eintrag

Code: Alles auswählen

updateStressInput("HAllo");
auskommentiere gibt es den Memory Fault nicht mehr.

Ich habe mir die Adresse des Zeigers stressFileLabel ausgeben lassen
und diese ist bei der Ausgabe in der updateStressInput - Methode anders als im Konstruktor.
0x722db0
0x722db0
0x6f667c6a00000000
Memory fault
Kann mir jemand erklären, warum die Adresse des Pointers sich ändert?
Vielen Dank.
Gruß
Patrick

P.S.: Hier noch das zugehörige Header File

Code: Alles auswählen

#ifndef CENTRALWIDGET
#define CENTRALWIDGET

#include <qvaluelist.h>
#include <iostream.h>
#include <qwidget.h>
#include <qstring.h>

class QGridLayout;
class QTextEdit;
class QLabel;

class lcfCentralWidget : public QWidget
{
    Q_OBJECT

public:
    lcfCentralWidget( QWidget *parent, const char *name = 0 );
   
	
	
    
public slots:
	 void updateStressInput(const QString filename);	

protected slots:


protected:

private:
QLabel* stressFileLabel;   
QGridLayout* mainGrid;
QTextEdit* textedit;    
    

};




#endif


Verfasst: 8. Februar 2007 16:10
von Christian81
Weil Du stressFileLabel lokal im Konstruktor definierst.

Verfasst: 8. Februar 2007 16:12
von franzf
stressFileLabel ist ja ein Member deiner Klasse. Drum lass das QLabel im Konstruktor weg. Es muss heißen

Code: Alles auswählen

stressFileLabel = new QLabel( "StressInputFile", this );
Gilt übrigens für alle Pointer, welche in der Klassen-Deklaration angegeben sind.
Nach dem der Konstruktor fertig ist ist stressFileLabel==NULL!
Deshalb der SegFault.

Grüße
Franz

// edit
Kacke, zu spät :cry:

Danke !!!!

Verfasst: 8. Februar 2007 16:15
von patrickp
Hab meinen Schädel grad ein paar mal gegen die nächste Wand gehauen.
Damit das endlich mal drin bleibt :-)

Läuft jetzt super. Vielen Dank für die schnelle Hilfe.
Gruß
Pat

Verfasst: 8. Februar 2007 16:17
von Christian81
franzf hat geschrieben: // edit
Kacke, zu spät :cry:
Nicht traurig sein - ich bin nicht immer da :)
Ausserdem hätte ich den Fehler fast nicht gesehen...

Verfasst: 8. Februar 2007 16:25
von franzf
Christian81 hat geschrieben:
franzf hat geschrieben: // edit
Kacke, zu spät :cry:
Nicht traurig sein - ich bin nicht immer da :)
:cry: :( :? :) :D ok, geht schon besser

:lol: