• 9259阅读
  • 2回复

【提问】segmentation fault : 模仿application的例子写了段程序 [复制链接]

上一主题 下一主题
离线yukishiro
 
只看楼主 倒序阅读 楼主  发表于: 2005-10-16
DDD里面的错误是这样的,我觉得很奇怪。我原本没有定义statusBar,后来定义了并且加上
statusBar = new QStatusBar;
statusBar-> showMessage(tr("ready"));
还是出错。

Program received signal SIGSEGV, Segmentation fault.
0xf6d91d5e in QMainWindowLayout::statusBar (this=0x9036890) at widgets/qmainwindowlayout.cpp:219
/home/jing/programming/qt-x11-opensource-src-4.0.1/src/gui/widgets/qmainwindowlayout.cpp:219:5963:beg:0xf6d91d5e

此错误发生在点击菜单(比如&Help)然后选择下拉项(比如About)的时候
不知道有没有人发生过这样的情况呢?我开始是怀疑有没有东西没有被初始化,但是好像没有。
代码贴在下面了,希望能有高手指点一二。谢谢了。

  1. #ifndef _MAINWINDOW_H
  2. #define _MAINWINDOW_H
  3. #include <QMainWindow>
  4. #include <QMenu>
  5. #include <QGroupBox>
  6. #include <QPushButton>
  7. #include <string>
  8. #include "renderarea.h"
  9. #include "../core/export.h"
  10. using std::string;
  11. class MainWindow : public QMainWindow {
  12.     Q_OBJECT
  13. public:
  14.     MainWindow();
  15. private slots:
  16.     void open();
  17.     //bool save();
  18.     void about();
  19. private:
  20.     void createActions();
  21.     void createMenus();
  22.     void createShapeGroupBox();
  23.     void createAttributeGroupBox();
  24.    
  25.     void loadFile(const QString &fullFileName);
  26.     //bool saveFile(const QString &fileName);
  27.     Scene *currentScene;    
  28.     RenderArea *renderarea;
  29.     QMenuBar *menuBar;
  30.     QStatusBar *statusBar;
  31.     QMenu *fileMenu;
  32.     QMenu *helpMenu;
  33.     QAction *openAct;
  34.     //QAction *saveAct;
  35.     QAction *aboutAct;
  36.    
  37.     QGroupBox *shapeGroupBox;
  38.     QGroupBox *attributeGroupBox;
  39.    
  40.     QPushButton *sphereButton;
  41.     QPushButton *triangleButton;
  42. };
  43. #endif //_MAINWINDOW_H


  1. #include <QtGui>
  2. #include "mainwindow.h"
  3. MainWindow::MainWindow() {
  4.     renderarea = new RenderArea;
  5.     createActions();
  6.     createMenus();
  7.     createShapeGroupBox();
  8.     createAttributeGroupBox();
  9.        
  10.     QGridLayout *mainLayout = new QGridLayout;
  11.     delete layout(); //clean existing layout
  12.     mainLayout->setMenuBar(menuBar);
  13.     mainLayout->addWidget(renderarea,0,0,2,1);
  14.     mainLayout->addWidget(shapeGroupBox,0,1);
  15.     mainLayout->addWidget(attributeGroupBox,1,1);
  16.     setLayout(mainLayout);
  17.     setWindowTitle(tr("Fray - Frist Ray Tracer"));
  18.     statusBar = new QStatusBar;
  19.     statusBar-> showMessage(tr("ready"));
  20. }
  21. void MainWindow::open() {
  22.     QString fileName =QFileDialog::getOpenFileName(this);
  23.     if (!fileName.isEmpty()) {
  24.         loadFile(fileName);
  25.     }
  26. }
  27. /*
  28. bool MainWindow::save() {
  29. }
  30. */
  31. void MainWindow::about() {
  32.     QMessageBox::about(this, tr("About Fray"), tr("Ray tracer"));
  33. }
  34. void MainWindow::createActions() {
  35.     openAct = new QAction(QIcon("./images/open.png"), tr("&Open..."), this);
  36.     openAct->setShortcut(tr("Ctrl+O"));
  37.     openAct->setStatusTip(tr("Open an existing scene"));
  38.     connect(openAct,SIGNAL(triggered()), this, SLOT(open()));
  39.     aboutAct = new QAction(tr("About Fray"),this);
  40.     aboutAct->setStatusTip(tr("About this application"));
  41.     connect(aboutAct, SIGNAL(triggered()), this, SLOT(about()));
  42. }
  43. void MainWindow::createMenus() {
  44.     menuBar = new QMenuBar;
  45.     fileMenu = menuBar->addMenu(tr("&File"));
  46.     fileMenu->addAction(openAct);
  47.     menuBar->addSeparator();
  48.     helpMenu = menuBar->addMenu(tr("&Help"));
  49.     helpMenu->addAction(aboutAct);
  50. }
  51. void MainWindow::createShapeGroupBox() {
  52.     shapeGroupBox = new QGroupBox(tr("Primitive Shapes"));
  53.     sphereButton = new QPushButton(tr("Sphere"));
  54.     triangleButton = new QPushButton(tr("Triangle"));
  55.    
  56.     QGridLayout *layout = new QGridLayout;
  57.     layout->addWidget(sphereButton,0,0);
  58.     layout->addWidget(triangleButton,0,1);
  59.     delete shapeGroupBox->layout();
  60.     shapeGroupBox->setLayout(layout);
  61.     shapeGroupBox->setFixedSize(200,100);
  62. }
  63. void MainWindow::createAttributeGroupBox() {
  64.     attributeGroupBox = new QGroupBox(tr("Attributes"));
  65. }
  66. void MainWindow::loadFile(const QString &fullFileName) {
  67.     currentScene = new Scene(fullFileName);
  68.    
  69.     QApplication::setOverrideCursor(Qt::WaitCursor);
  70.     renderarea->loadScene(currentScene);
  71.     QApplication::restoreOverrideCursor();
  72.    
  73.     //set current file
  74. }
[ 此贴被XChinux在2005-10-17 02:42重新编辑 ]
离线yfy002

只看该作者 1楼 发表于: 2005-10-17
Re:【提问】segmentation fault : 模仿application的例子写
statusBar = new QStatusBar(this);
statusBar-> showMessage(tr("ready"));

or
statusBar()->showMessage(tr("ready"));
我渴望平静,风却给了我涟漪
我的blog:
http://sungaoyong.cublog.cn
离线yukishiro
只看该作者 2楼 发表于: 2005-10-17
看上去好像是因为我错误的使用了
delete layout();
导致了dangling pointer
快速回复
限100 字节
 
上一个 下一个