• 6310阅读
  • 9回复

QT中遇到的怪问题 [复制链接]

上一主题 下一主题
离线superrui
 
只看楼主 倒序阅读 楼主  发表于: 2009-11-28
QT中遇到的怪问题

我刚做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();

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

只看该作者 1楼 发表于: 2009-11-28
你没有使用 Q_OBJECT 宏
QT自带的文档真是个好东西
一定要好好看呀
离线superrui
只看该作者 2楼 发表于: 2009-11-29
可是我加了Q_OBJECT之后,会显示一大堆的错误
In function `MyWidget::MyWidget(QWidget*, char const*)':
main.cpp:(.text+0x2f): undefined reference to `vtable for MyWidget'
main.cpp:(.text+0x36): undefined reference to `vtable for MyWidget'
main.o: In function `main':
main.cpp:(.text+0x2ad): undefined reference to `vtable for MyWidget'
main.cpp:(.text+0x2b9): undefined reference to `vtable for MyWidget'
main.cpp:(.text+0x2fa): undefined reference to `vtable for MyWidget'
main.o:main.cpp:(.text+0x306): more undefined references to `vtable for MyWidget' follow

我不太明白。
离线dbzhang800

只看该作者 3楼 发表于: 2009-11-29
楼主可能用的是Qt3,我没用过Qt4.5之前的版本,简单说一下看法,不一定对。

1. 这个类没有自定义信号和槽,应该不需要 Q_OBJECT。
2. 如果加了 Q_OBJECT, 应该重新运行运行 qmake
3. 这个程序也没几行,楼主可以一行一行的删掉看看
离线superrui
只看该作者 4楼 发表于: 2009-11-29
我按照您建议的那样测试过。主程序一到MyWidget w;这里就运行不过去。除了报segfault,其他什么错误也没有报。
离线superrui
只看该作者 5楼 发表于: 2009-11-29
哦,对了,我用的QT版本是QT2.2.0.真让我郁闷啊。
离线dbzhang800

只看该作者 6楼 发表于: 2009-11-29
引用第4楼superrui于2009-11-29 14:09发表的  :
我按照您建议的那样测试过。主程序一到MyWidget w;这里就运行不过去。除了报segfault,其他什么错误也没有报。


构造函数中的内容都删除以后还是这样吗?
离线superrui
只看该作者 7楼 发表于: 2009-11-29
构造函数中的东西我把它们都屏蔽了只留下下面的东西
class MyWidget : public QWidget
{
public:
MyWidget( QWidget *parent=0, const char *name=0 );
};


MyWidget::MyWidget( QWidget *parent, const char *name )
: QWidget( parent, name )
{

}


然后再主程序里添加了一个printf的函数,想看看程序究竟错哪了
int main(int argc,char **argv)
{
    QApplication a(argc,argv);
    
    MyMainWindow w;
    a.setMainWidget(&w);
    w.show();
    return a.exec();
printf("error\n");
}
在return那句之前,程序输出都是:
有一个一闪而过的框.然后输出
error
segfault
结果直到我把printf移动到return a.exec()的后面时
还是会有一个一闪而过的框,然后显示
segfault

我被搞的有点晕。
[ 此帖被superrui在2009-11-29 15:06重新编辑 ]
离线rqzrqh

只看该作者 8楼 发表于: 2009-11-29
运行正常。可能楼主用的是qt3的qmake,编译用的又是不同的QT版本
离线superrui
只看该作者 9楼 发表于: 2009-11-29
那我应该怎么办呀?我的QT版本应该是qt2.2.0.初次接触这个,很多地方都不明白
快速回复
限100 字节
 
上一个 下一个