Anfängerübung mit Absturz

Alles zur Entwicklung von KDE - Anwendungen
Antworten
Caeruleus
Beiträge: 2
Registriert: 17. August 2009 17:02

Anfängerübung mit Absturz

Beitrag von Caeruleus » 17. August 2009 18:41

Ich begreife nicht, warum bei untigem Programm die Zeile
mytextedit->setText("Hey") wie erwartet funktioniert, wenn ich die gleiche Zeile aber über die Methode go() aufrufe, das Programm abstürzt.

Vielen Dank!


main.cpp:

#include <KApplication>
#include <KAboutData>
#include <KCmdLineArgs>
#include <QDebug>
#include "mainwindow.h"
#include <iostream>

int main (int argc, char **argv)
{

KAboutData aboutData( "x1", 0,
ki18n("x1"), "1.0",
ki18n("Peter Schmidt"),
KAboutData::License_GPL,
ki18n("Copyright (c) 2007 Developer") );
KCmdLineArgs::init( argc, argv, &aboutData);

KApplication app;

MainWindow* window = new MainWindow();
window->show();

return app.exec();
}


mainwindow.h:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <KXmlGuiWindow>
#include <KTextEdit>


class MainWindow : public KXmlGuiWindow
{
Q_OBJECT

public:
MainWindow(QWidget *parent=0);

private:
QTextEdit* mytextedit;

private slots:
void go();
};
#endif


mainwindow.cpp:

#include "mainwindow.h"
#include <QVBoxLayout>
#include <QPushButton>
#include <QTextEdit>

MainWindow::MainWindow(QWidget *parent) : KXmlGuiWindow(parent)

{
QWidget *mainWidget = new QWidget(this);
QVBoxLayout * mylayout = new QVBoxLayout(mainWidget);

QTextEdit *mytextedit = new QTextEdit(this);

mylayout->addWidget(mytextedit);

mytextedit->setText("Hey");
//go();

QPushButton * mybutton = new QPushButton("Go!",this);
mylayout->addWidget(mybutton);

setCentralWidget(mainWidget);
setupGUI();
}

void MainWindow::go() {
mytextedit->setText("Hey");
}

franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: Anfängerübung mit Absturz

Beitrag von franzf » 17. August 2009 19:46

Code: Alles auswählen

class MainWindow : public KXmlGuiWindow
     {
      Q_OBJECT
      
      public:
      MainWindow(QWidget *parent=0);

      private:
      QTextEdit* mytextedit;  // das ist dein member
            
       private slots:
       void go();
      };

[...]

MainWindow::MainWindow(QWidget *parent) : KXmlGuiWindow(parent)

{
 [...]
    QTextEdit *mytextedit = new QTextEdit(this); // sooooo, was passiert hier?

    mytextedit->setText("Hey");
 [...]
}
Was denkst du was du im Konstruktor machst?
Schau dir das GENAU und so oft an bis du es verstehst :)
TIP: Ist das das gleiche Objekt, wie das das du als Member deklariert hast?

Caeruleus
Beiträge: 2
Registriert: 17. August 2009 17:02

Beitrag von Caeruleus » 18. August 2009 15:31

OK, vielen Dank, wenn ich das QTextEdit * weglasse geht es, aber was daran falsch ist, verstehe ich nicht.

QTextEdit* mytextedit; in der Deklaration heißt doch soviel wie: Die Variable mytextedit wird einen Zeiger auf ein QTextEdit Objekt enthalten.

und

QTextEdit * mytextedit = new QTextEdit(this);

im Code heißt: reserviere Speicher für eine QTextEdit Objekt und initialisiere es und schreibe den Zeiger darauf in die Variable mytextedit

oder?

Curtis Newton
Beiträge: 122
Registriert: 11. Juni 2008 18:39

Beitrag von Curtis Newton » 18. August 2009 15:53

Beschäftige Dich mal mit der Gültigkeit von Variablen. Du hast ZWEI Variablen namens mytextedit! Einmal das in der Klasse und einmal eins lokal. Das zu suchen ist die Hausaufgabe ;-)


C.

Antworten