分段故障

时间:2014-02-22 14:45:34

标签: qt segmentation-fault qt-creator qtgui

我正在尝试使用一些工具栏和菜单构建MainWindow。 所以在我的mainwindow.h中

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

class QAction;
class QMenu;
class QToolBar;
class QStatusBar;


class MainWindow : public QMainWindow
{
    Q_OBJECT

 public:
    MainWindow();

 protected:
    void closeEvent(QCloseEvent *event);

 private slots:
     void open();
     void save();
//void updateStatusBar();

 private:
     void createToolbars();
     void createActions();
     void createMenus();
     void createStatusBar();
 bool loadFile(const QString &fileName);
 bool saveFile(const QString &fileName);

 QToolBar *filetBar;
 QAction *openAction;
 QAction *saveAction;
 QAction *separatorAction;
 QAction *exitAction;
 QStatusBar *stsBar;
 QMenu *fileMenu;
 };

 #endif // MAINWINDOW_H

我有私有变量QToolbar * filetBar; 在.cpp文件中, 我打电话给: createToolbars是:

#include <QtGui>
#include "mainwindow.h"
#include <QMdiArea>
#include <QMdiSubWindow>
#include <QAction>
#include <QToolBar>
#include <QMenuBar>
#include <QMenu>
#include <QStatusBar>
#include <QFileDialog>
#include <QToolButton>

// #include“mdichild.h”

 MainWindow::MainWindow()
 {
    mdiArea = new QMdiArea;
    mdiArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded);
    mdiArea->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);
    setCentralWidget(mdiArea);

    createToolbars();
    createActions();
    createMenus();
    createStatusBar();

    setWindowTitle(tr("GUI OPTIMIZER"));
    setUnifiedTitleAndToolBarOnMac(true);
    setWindowIcon(QIcon(":/images/up.jpeg"));
   }
   void MainWindow::createActions()
   {
     openAction = new QAction(QIcon(":images/open.png"), tr("&Open"), this);
     openAction->setShortcut(QKeySequence::Open);
     openAction->setStatusTip(tr("Open your gui (*.al) file"));
     connect(openAction, SIGNAL(triggered()), this, SLOT(open()));

     saveAction = new QAction(QIcon(""), tr("&Save"), this);
saveAction->setShortcut(QKeySequence::Save);
saveAction->setStatusTip(tr("Save optimized gui"));
connect(saveAction, SIGNAL(triggered()), this, SLOT(save()));

exitAction = new QAction(QIcon(""), tr("&Close"), this);
exitAction -> setShortcut(QKeySequence::Close);
connect(exitAction, SIGNAL(triggered()), this, SLOT(close()));

   }

   void MainWindow::createToolbars()
   {
     filetBar = new QToolBar("File", this);
     filetBar = addToolBar(tr("&File"));
     filetBar->addAction(openAction);

   }

   void MainWindow::createMenus()
   {
      fileMenu = menuBar()->addMenu(tr("&File"));
      fileMenu->addAction(openAction);
      fileMenu->addAction(saveAction);
      separatorAction = fileMenu->addSeparator();
      fileMenu->addSeparator();
      fileMenu->addAction(exitAction);
   }

当我跑步时,它只是说程序意外地完成了。 当我用调试器运行它时给了我

信号名称:SIGSEGV 信号含义:分段故障 广告

它显示菜单,并且操作正在运行。 知道怎么解决它? 谢谢。 `

1 个答案:

答案 0 :(得分:1)

在使用它们之前,您需要确保每个成员变量在构造函数中初始化为一些合理的值。这意味着对于以下每一个:

 QToolBar *filetBar;
 QAction *openAction;
 QAction *saveAction;
 QAction *separatorAction;
 QAction *exitAction;
 QStatusBar *stsBar;
 QMenu *fileMenu;

你需要有一个相应的:

filetBar = new QToolBar( /* ... */ );

特别是您将未初始化的QAction对象传递给您的小部件。在构造函数中,或者在从构造函数调用的单独方法中,您应该具有如下代码:

 openAction = new QAction("&Open", this);
 saveAction = new QAction("&Save", this);
 // etc.