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!


  • Mod

    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.


Anmelden zum Antworten