主题 : QT中遇到的怪问题 复制链接 | 浏览器收藏 | 打印
从此生活在arm9home的世界中
级别: 新手上路
UID: 10620
精华: 0
发帖: 23
金钱: 225 两
威望: 111 点
综合积分: 46 分
注册时间: 2009-11-10
最后登录: 2010-01-27
楼主  发表于: 2009-11-28 16:50

 QT中遇到的怪问题

管理提醒: 本帖被 kasim 执行合并操作(2009-11-29)
我刚做QT不久。
最近在按照教材学习。
但是我发现了一个很奇怪的问题
只要遇到在QT程序中需要使用类的继承的时候,系统就会报错显示segfault
但是我如果不采用类的继承,而是把所有东西都放在主程序中就会运行顺畅。
我不知道只是因为什么,有哪位大侠能为我解答一下吗?
下面是一个使用类继承运行不了和一个没有使用类继承运行成功的程序:
#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();
}
上面这个程序由于使用类继承,结果运行不了。显示段错误就是segfault.

#include <qapplication.h>
#include <qpushbutton.h>
#include <qfont.h>
#include <qwidget.h>
int main( int argc, char **argv )
{
    QApplication app( argc, argv );

    QWidget w;

    
    w.setMinimumSize(200,120);
    w.setMaximumSize(200,120);

    QPushButton quit("Quit",&w);
    quit.setGeometry(62, 40, 75, 30);
    
    QObject::connect(&quit,SIGNAL(clicked()),&app,SLOT(quit()));
    app.setMainWidget( &w );


    w.show();

  return app.exec();

}
这个程序师我调整了之后没有采用类继承,结果运行成功。


从此生活在arm9home的世界中
级别: 新手上路
UID: 10620
精华: 0
发帖: 23
金钱: 225 两
威望: 111 点
综合积分: 46 分
注册时间: 2009-11-10
最后登录: 2010-01-27
1楼  发表于: 2009-11-25 18:46

 修改后重新提问:QT编译运行出现错误:段错误

我是按照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
段错误

我用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

我查看了一下说internalSetGeometry是qWidget的私有成员。这里出错时说我在程序里SetGeometry在设置的时候出现指代不清的问题了吗?
还是说设置的时候出现了溢出?还是说libqt.so.2这个库出现了问题?
真的是很诚心的向大家求教。拜托了。

PS一下:今天又进步了一点点知道用gdb调试了。
[ 此帖被superrui621在2009-11-26 12:33重新编辑 ]
从此生活在arm9home的世界中
级别: 新手上路
UID: 10620
精华: 0
发帖: 23
金钱: 225 两
威望: 111 点
综合积分: 46 分
注册时间: 2009-11-10
最后登录: 2010-01-27
2楼  发表于: 2009-11-26 15:10
  帮帮我吧。我现在已经抑郁的,让宿舍的人看了都害怕了。
从此生活在arm9home的世界中
级别: 新手上路
UID: 10620
精华: 0
发帖: 23
金钱: 225 两
威望: 111 点
综合积分: 46 分
注册时间: 2009-11-10
最后登录: 2010-01-27
3楼  发表于: 2009-11-27 22:36
我运行了一下,好像是类的定义或者调用上出了问题。可是我不知道问题在哪。能有人帮帮我吗