Seg Fault bei QT3



  • Hallo!
    Ich habe meine ersten Versuche mit einem QT-Hauptfenster gestartet. Und schon
    bin ich gescheitert. Der Code ist noch nicht ganz vollständig, aber ich
    wollte mir mal ansehen, wie er bis jetzt aussieht. Einiges ist noch
    auskommentiert, oder noch nicht implementiert.
    Folgende Headerdatei:

    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H
    
    #include <qmainwindow.h>
    
    class QAction;
    class QLabel;
    
    class cMainwindow : public QMainWindow
    {
       Q_OBJECT
    public:
        cMainwindow(QWidget *parant = 0, const char *name = 0);
    
        ~cMainwindow();
    
    protected:
       //void closeEvent(QCloseEvent *event);
       void ContextMenuEvent(QContextMenuEvent *event);
    
    private slots:
       void newProject();
       void openProject();
       bool saveProject();
       bool saveProjectAs();
       void printProject();
       void launchProject();
       void ProjectModified();
    
    private:
       void createActions();
       void createMenus();
       void createToolBars();
       void createStatusBar();
       void readSettings();
       void writeSettings();
       bool maybeSave();
       void loadProject(const QString &FileName);
       void saveProject(const QString &FileName);
       void setCurrentProject(const QString &FileName);
       QString FileFilters;
       bool Modified;
       QPopupMenu *ProjectMenu;
       QPopupMenu *EditMenu;
       QPopupMenu *SelectSubMenu;
       QPopupMenu *ExtrasMenu;
       QPopupMenu *OptionsMenu;
       QPopupMenu *HelpMenu;
       QToolBar *ProjectToolBar;
       QToolBar *EditToolBar;
       QToolBar *MiscToolBar;
       QAction *NewAct;
       QAction *OpenAct;
       QAction *SaveAct;
       QAction *SaveAsAct;
       QAction *PrintAct;
       QAction *LaunchAct;
       QAction *ExitAct;
       QAction *UndoAct;
       QAction *CutAct;
       QAction *CopyAct;
       QAction *PasteAct;
       QAction *DeleteAct;
       QAction *SelectAllAct;
       QAction *SelectInvAct;
       QAction *SelectNoneAct;
       QAction *FindAct;
       QAction *BombEditorAct;
       QAction *PictureSimulationAct;
       QAction *OptionsAct;
       QAction *WhatsThisAct;
       QAction *ManualAct;
       QAction *AboutAct;
    };
    
    #endif
    

    Dann die Implementierung:

    #include <qapplication.h>
    #include <qaction.h>
    #include <qfiledialog.h>
    #include <qlabel.h>
    #include <qmenubar.h>
    #include <qmessagebox.h>
    #include <qpopupmenu.h>
    #include <qsettings.h>
    #include <qstatusbar.h>
    #include <qstring.h>
    #include "mainwindow.h"
    
    cMainwindow::cMainwindow(QWidget *parent, const char *name) : QMainWindow(parent, name)
    {
        createActions();
        createMenus();
        createToolBars();
        //createStatusBar();
    
        //readSettings();
        setCaption(tr("Pyromaster"));
    
        FileFilters = tr("Pyromaster Projectfiles (*.pyr)");
        Modified = false;
    }
    
    cMainwindow::~cMainwindow()
    {}
    
    void cMainwindow::createActions()
    {
        NewAct = new QAction(tr("&New"), tr("Ctrl+N"), this);
        NewAct->setIconSet(QPixmap::QPixmap("images/new.png"));
        NewAct->setStatusTip(tr("Create a new Project"));
        connect(NewAct, SIGNAL(activated()), this, SLOT(newProject()));
    
        OpenAct = new QAction(tr("&Open"), tr("Ctrl+O"), this);
        OpenAct->setIconSet(QPixmap::QPixmap("images/folder.png"));
        OpenAct->setStatusTip(tr("Open an existing Project"));
        connect(OpenAct, SIGNAL(activated()), this, SLOT(openProject()));
    
        SaveAct = new QAction(tr("&Save"), tr("Ctrl+S"), this);
        SaveAct->setIconSet(QPixmap::QPixmap("images/floppy.png"));
        SaveAct->setStatusTip(tr("Save the project"));
        connect(SaveAct, SIGNAL(activated()), this, SLOT(saveProject()));
    
        SaveAsAct = new QAction(tr("Save &as"),0 , this);
        SaveAsAct->setStatusTip(tr("Save a copy of the project"));
        connect(SaveAsAct, SIGNAL(activated()), this, SLOT(saveProjectAs()));
    
        PrintAct = new QAction(tr("&Print"), tr("Ctrl+P"), this);
        PrintAct->setIconSet(QPixmap::QPixmap("images/printer.png"));
        PrintAct->setStatusTip(tr("Print the wiring diagram"));
        connect(PrintAct, SIGNAL(activated()), this, SLOT(printProject()));
    
        LaunchAct = new QAction(tr("&Launch"), tr("Ctrl+L"), this);
        LaunchAct->setIconSet(QPixmap::QPixmap("images/fire.png"));
        LaunchAct->setStatusTip(tr("Launches the Project"));
        connect(LaunchAct, SIGNAL(activated()), this, SLOT(launchProject()));
    
        ExitAct = new QAction(tr("E&xit"), tr("Ctrl+X"), this);
        ExitAct->setStatusTip(tr("Exit Pyromaster"));
    }
    
    void cMainwindow::createMenus()
    {
        ProjectMenu = new QPopupMenu(this);
        NewAct->addTo(ProjectMenu);
        OpenAct->addTo(ProjectMenu);
        SaveAct->addTo(ProjectMenu);
        SaveAsAct->addTo(ProjectMenu);
        ProjectMenu->insertSeparator();
        PrintAct->addTo(ProjectMenu);
        LaunchAct->addTo(ProjectMenu);
        ProjectMenu->insertSeparator();
        ExitAct->addTo(ProjectMenu);
    
        EditMenu = new QPopupMenu(this);
        UndoAct->addTo(EditMenu);
        CutAct->addTo(EditMenu);
        CopyAct->addTo(EditMenu);
        PasteAct->addTo(EditMenu);
        DeleteAct->addTo(EditMenu);
        SelectSubMenu = new QPopupMenu(this);
        SelectAllAct->addTo(SelectSubMenu);
        SelectInvAct->addTo(SelectSubMenu);
        SelectNoneAct->addTo(SelectSubMenu);
        EditMenu->insertItem(tr("&Auswahl"), SelectSubMenu);
        EditMenu->insertSeparator();
        FindAct->addTo(EditMenu);
    }
    
    void cMainwindow::createToolBars()
    {
        ProjectToolBar = new QToolBar(tr("Project"), this);
        NewAct->addTo(ProjectToolBar);
        OpenAct->addTo(ProjectToolBar);
        SaveAct->addTo(ProjectToolBar);
        PrintAct->addTo(ProjectToolBar);
    
        EditToolBar = new QToolBar(tr("Edit"), this);
        UndoAct->addTo(EditToolBar);
        CutAct->addTo(EditToolBar);
        CopyAct->addTo(EditToolBar);
        PasteAct->addTo(EditToolBar);
        DeleteAct->addTo(EditToolBar);
        FindAct->addTo(EditToolBar);
    
        MiscToolBar = new QToolBar(tr("Misc"), this);
        OptionsAct->addTo(MiscToolBar);
        BombEditorAct->addTo(MiscToolBar);
        PictureSimulationAct->addTo(MiscToolBar);
        LaunchAct->addTo(MiscToolBar);
    }
    
    void cMainwindow::ContextMenuEvent(QContextMenuEvent *event)
    {
        QPopupMenu *ContextMenu = new QPopupMenu(this);
        CutAct->addTo(ContextMenu);
        CopyAct->addTo(ContextMenu);
        PasteAct->addTo(ContextMenu);
        DeleteAct->addTo(ContextMenu);
        ContextMenu->exec(event->globalPos());
        delete ContextMenu;
    }
    
    void cMainwindow::newProject()
    {}
    
    void cMainwindow::openProject()
    {}
    
    bool cMainwindow::saveProject()
    {}
    
    bool cMainwindow::saveProjectAs()
    {}
    
    void cMainwindow::printProject()
    {}
    
    void cMainwindow::launchProject()
    {}
    
    void cMainwindow::ProjectModified()
    {}
    
    // void cMainwindow::closeEvent(QCloseEvent *CloseEvent)
    // {
    // }
    

    Alles kompiliert mit Kdevelop-3.4.0 mit dem KDE-Anwendungstemplate.
    Doch ich erhalte einen Seg Fault beim Ausführen.
    Daraufhin hab ich den Debugger angeworfen, und folgendes festgestellt:
    In mainwindow.moc.cpp scheitert er an der return-Anweisung.

    #ifndef QT_NO_TRANSLATION
    QString cMainwindow::tr( const char *s, const char *c )
    {
        if ( qApp )
    	return qApp->translate( "cMainwindow", s, c, QApplication::DefaultCodec );
        else
    	return QString::fromLatin1( s );
    }
    

    s weist auf eine gültige Adresse und dereferenziert "&New".
    c weist auf 0x0, und ich vermute, dass es darum nicht funktioniert.
    Ich kann aber leider nirgends den Fehler finden.
    Weiss jemand Rat?



  • Ich hab jetzt das ganze in ein qmake basiertes Projekt übertragen.
    Aber auch hier ein Seg Fault.



  • Ich hab da was falsch angegeben.
    Ich habe festgestellt, dass das 0x0 für c ok ist.
    Der Seg Fault kommt bei der setIconSet-Funktion.
    Hier ist noch mein Projektfile:

    TEMPLATE = app
    
    SOURCES += pyromaster.cpp \
    bomb.cpp \
    bomblist.cpp \
    configfile.cpp \
    mainwindow.cpp
    HEADERS += bomb.h \
    bomblist.h \
    configfile.h \
    mainwindow.h
    CONFIG += debug \
    warn_on
    TARGET = ../bin/pyromaster
    
    IMAGES = ../images/new.png \
    ../images/folder.png \
    ../images/floppy.png \
    ../images/fire.png \
    ../images/printer.png
    
    LIBS += -lImlib2
    

    Die Bilder erscheinen auch im Qmake-Manager, und ich kann diese in Kdevelop
    auch öffnen. Also müsste er sie auch finden.
    Das Erstellen der Actions hab ich jetzt auch so gemacht:

    NewAct = new QAction(tr("&New"), 0, this);
        NewAct->setIconSet(QPixmap::fromMimeSource("new.png"));
        NewAct->setStatusTip(tr("Create a new Project"));
        connect(NewAct, SIGNAL(activated()), this, SLOT(NewProject()));
    


  • Schick das mal durch Valgrind.



  • Ich hab's gelöst bekommen. Mann, wie blöd!
    Es lag auch nicht an der Pixmap Geschichte.
    Ich habe den Menüs Actions hinzugefügt, die zu diesem Zeitpunkt noch gar
    nicht existieren. Ich hab sie ja noch gar nicht implementiert.
    Der Debugger scheint sich aber bei QT extrem komisch zu verhalten.
    Zuerst hat er mir den Seg Fault an den beiden zuerst genannten Stellen
    ausgegeben. Und dann sucht man natürlich an der falschen Stelle.


Anmelden zum Antworten