• 6659阅读
  • 6回复

我的问题好多啊:QT编译运行出现错误:段错误 [复制链接]

上一主题 下一主题
离线superrui
 
只看楼主 倒序阅读 楼主  发表于: 2009-11-25
我是按照QT里的参考文档写的下面的内容:

#include <qapplication.h>
#include <qpushbutton.h>
#include <qfont.h>


class MyWidget : public QWidget
{
public:
MyWidget( QWidget *parent=0, const char *name=0 );
};


MyWidget::MyWidget( QWidget *parent, const char *name )
: QWidget( parent, name )
{
setMinimumSize( 200, 120 );
setMaximumSize( 200, 120 );

QPushButton *quit = new QPushButton( "Quit", this, "quit" );
quit->setGeometry( 62, 40, 75, 30 );
quit->setFont( QFont( "Times", 18, QFont::Bold ) );

connect( quit, SIGNAL(clicked()), qApp, SLOT(quit()) );
}


int main( int argc, char **argv )
{
QApplication a( argc, argv );

MyWidget w;
w.setGeometry( 100, 100, 200, 120 );
a.setMainWidget( &w );
w.show();
return a.exec();
}


用qmake 生成pro文件,再用qmake生成makefile,然后make编译。
这个过程中程序没有报任何错误。
当我运行可执行文件的时候,就会报错
[root@localhost third]# qmake -project
[root@localhost third]# qmake
[root@localhost third]# make
g++ -c -pipe -Wall -W -O2 -DQT_NO_DEBUG -I/opt/FriendlyARM/mini2440/x86-qtopia/qtopia-2.2.0-FriendlyARM/qtopia/mkspecs/linux-g++ -I. -I. -I/opt/FriendlyARM/mini2440/x86-qtopia/qtopia-2.2.0-FriendlyARM/qt2/include -o main.o main.cpp
g++ -Wl,-rpath,/opt/FriendlyARM/mini2440/x86-qtopia/qtopia-2.2.0-FriendlyARM/qt2/lib -o third main.o -L/opt/FriendlyARM/mini2440/x86-qtopia/qtopia-2.2.0-FriendlyARM/qt2/lib -L/usr/X11R6/lib -lqt -lXext -lX11 -lm
[root@localhost third]# ./third
段错误

看了网上的帖子,大概是说可能存在溢出或者数据内存访问错误。可是我才疏学浅看不出来是哪里出了问题。请大侠们帮帮忙解答一下。

我用的QT版本是QT2.2.0.开发板是友善之臂。Linux系统是fedora9.Linux内核是2.6.2
离线foxyz

只看该作者 1楼 发表于: 2009-11-26
请你把这个:QPushButton *quit
放到类的成员变量去.
class MyWidget : public QWidget
{
public:
MyWidget( QWidget *parent=0, const char *name=0 );
private:
QPushButton *quit ;
};

MyWidget::MyWidget( QWidget *parent, const char *name )
: QWidget( parent, name ) , quit(NULL)
{
setMinimumSize( 200, 120 );
setMaximumSize( 200, 120 );

quit = new QPushButton( "Quit", this, "quit" );
quit->setGeometry( 62, 40, 75, 30 );
quit->setFont( QFont( "Times", 18, QFont::Bold ) );

connect( quit, SIGNAL(clicked()), qApp, SLOT(quit()) );
}
离线superrui
只看该作者 2楼 发表于: 2009-11-26
引用第1楼foxyz于2009-11-26 09:59发表的  :
请你把这个:QPushButton *quit
放到类的成员变量去.
class MyWidget : public QWidget
{
public:
.......


我按照您说的把QPushButton *quit放到类的成员变量去了
可是还是会包错:段错误。

我今天学着用gdb调试,它显示的错误信息如下:
Program received signal SIGSEGV, Segmentation fault.
0x0087340a in QWidget::internalSetGeometry ()
   from /opt/FriendlyARM/mini2440/x86-qtopia/qtopia-2.2.0-FriendlyARM/qt2/lib/libqt.so.2

我不太明白这个错误的意思。您能给我讲讲吗
离线foxyz

只看该作者 3楼 发表于: 2009-11-26
按照我的做法不会错误, 你把一个控件变量定义成局部变量,出了那个函数就出了作用域了,你再去访问,当然是访问错误.
简单点说,你这个QPushButton *quit 在你要访问的时候早就不存在了. 你把你的代码贴完整了给我看看
离线superrui
只看该作者 4楼 发表于: 2009-11-26
引用第3楼foxyz于2009-11-26 16:16发表的  :
按照我的做法不会错误, 你把一个控件变量定义成局部变量,出了那个函数就出了作用域了,你再去访问,当然是访问错误.
简单点说,你这个QPushButton *quit 在你要访问的时候早就不存在了. 你把你的代码贴完整了给我看看


我按照您说的,对main.cpp做了如下的改动
/****************************************************************
**
** Qt教程一 - 4
**
****************************************************************/

#include <qapplication.h>
#include <qpushbutton.h>
#include <qfont.h>



class MyWidget : public QWidget
{
public:
    MyWidget( QWidget *parent=0, const char *name=0 );
private:
     QPushButton *quit;
};


MyWidget::MyWidget( QWidget *parent, const char *name )
        : QWidget( parent, name ),quit(NULL)
{
    setMinimumSize( 200, 120 );
    setMaximumSize( 200, 120 );

    quit=new QPushButton( "Quit", this, "quit" );

    quit->setGeometry( 62, 40, 75, 30 );

    quit->setFont( QFont( "Times", 18, QFont::Bold ) );

    connect( quit, SIGNAL(clicked()), qApp, SLOT(quit()) );
}


int main( int argc, char **argv )
{
    
    QApplication a( argc, argv );
    

    MyWidget w;

    w.setGeometry( 100, 100, 200, 120 );

    a.setMainWidget( &w );
    w.show();
    return a.exec();
}

.pro和makefile我都是用qmake做的,一点改动没有。
[ 此帖被superrui在2009-11-26 20:08重新编辑 ]
离线superrui
只看该作者 5楼 发表于: 2009-11-27
帮帮我吧。
离线foxyz

只看该作者 6楼 发表于: 2009-11-30
建议你去看看 QT的例子程序:dynamiclayouts
快速回复
限100 字节
 
上一个 下一个