QT - QWidget
-
Hallo,
bin neu in der Welt der QT'ler. Ich poste direkt mal den Code:#ifndef MAINWINDOW_HEADER #define MAINWINDOW_HEADER #include "StdIncludes.h" #include <QtGui/QGridLayout> #include <QtGui/QMainWindow> #include <QtGui/QGroupBox> class MainWindow : public QMainWindow { Q_OBJECT private: QGroupBox *InputArea(); public: MainWindow(); ~MainWindow(); }; #endif MAINWINDOW_HEADER
Und hier die zugehörige cpp-Datei:
#include "MainWindow.h" MainWindow::MainWindow() { QGridLayout *grid = new QGridLayout; grid->addWidget(InputArea(), 0, 0); } QGroupBox* MainWindow::InputArea() { return &QGroupBox(new QGroupBox(tr("Input-Area"))); } MainWindow::~MainWindow() { }
Wenn ich das nun kompilieren möchte, kommt:
Unhandled exception at 0x650e01da (QtGuid4.dll) in Smiley-Generator.exe: 0xC0000005: Access violation reading location 0x87ce18a2.
und zeigt mir diese Zeile an:
class Q_GUI_EXPORT QWidget : public QObject, public QPaintDevice { Q_OBJECT Q_DECLARE_PRIVATE(QWidget) //<< DIE DA!!!
Stehe vollkommen auf dem Schlauch und bin ebenso schockiert, das es nur so wenig Tutorials gibt (die von trolltech/nokia sind einfach nur gaga). Aber naja, für die meisten geilen libs gibt es zu wenig Tutorials...
Wäre froh, wenn mir einer sagen könnte, was da los ist.
Ich danke vielmals im Voraus!
-
So geht das nicht.
Du bist dir bewusst, das du ein lokales Objekt da auf dem Stack anlegst, welchem du das mit new erzeugte Objekt als Parent gibst?
Nach dem Funktionsaufruf jedoch wird der Stack ja wieder freigegeben, dein Objekt ist somit auch zerstört.phlox
-
*Kopf auf Tisch schlag*
Danke, läuft!
-
das ist kein Qt-Problem, sondern eher ein c++-Problem
warum überhaupt eine Methode, die dir ein Objekt erzeugt und zurückgibt? Erzeug das Objekt einmal im Konstruktor, gib deine eigene Klasse als parent mit und fertig. Falls du den Zeiger für später brauchst, kannst du ihn auch speichern
class MainWindow : public QMainWindow { Q_OBJECT private: QGroupBox _inputArea; public: MainWindow(QWidget* parent = 0, Qt::WindowFlags flags = 0); // Siehe Konstruktor von QMainWindow ~MainWindow(); }; // --- MainWindow::MainWindow(QWidget* parent, Qt::WindowFlags flags) : QMainWindow(parent, flags), _inputArea(new QGroupBox(tr("Input-Area"), this)) { QGridLayout *grid = new QGridLayout; grid->addWidget(_inputArea, 0, 0); } MainWindow::~MainWindow() { }
macht das ganze deutlich angenehmer.
Dadurch, dass du den parent im Konstruktor eines von QObject abgeleiteten Objektes mitgibst, kümmert sich dieser drum, dass seine Kinder zerstört werden.