QT高手进来看一看,瞧一瞧.

lzwwiner 2004-12-06 05:32:44
MyWidget 是我定义的一个类,开始的时候我没有在类中添加槽,添加后编译就是这样的错误,给我说说好吗?

g++ -c -pipe -Wall -W -O2 -march=i386 -mcpu=i686 -g -DGLX_GLXEXT_LEGACY -fno-use-cxa-atexit -fno-exceptions
-DQT_NO_DEBUG -I/usr/lib/qt-3.1/mkspecs/default -I. -I. -I/usr/lib/qt-3.1/include -o mymain.o mymain.cppg++ -o mylabel
mylabel.o mymain.o moc_mylabel.o -L/usr/lib/qt-3.1/lib -L/usr/X11R6/lib -lqt-mt -lXext -lX11 -lmmymain.o(.text+0x32):
In function `MyWidget::MyWidget[not-in-charge](QWidget*, char const*)':/workdir/mylabel/mymain.cpp:31: undefined
reference to `vtable for MyWidget'mymain.o(.text+0x39):/workdir/mylabel/mymain.cpp:31: undefined reference to `vtable
for MyWidget'mymain.o(.text+0x512): In function `MyWidget::MyWidget[in-charge](QWidget*, char const*)':
/workdir/mylabel/mymain.cpp:31: undefined reference to `vtable for MyWidget'
mymain.o(.text+0x519):/workdir/mylabel/mymain.cpp:31: undefined reference to `vtable for MyWidget'
collect2: ld returned 1 exit status
make: *** [mylabel] Error 1

定义信息和槽时,很多时候都出现这种错误.
我就是想知道一般什么原因会出现这种错误.
...全文
221 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
Jacode 2004-12-08
  • 打赏
  • 举报
回复
错误提示其实没错,但是导致错误的真正原因编译器无法知道。
这可能是QT的moc的一个bug
lzwwiner 2004-12-08
  • 打赏
  • 举报
回复
to Jacode(thinking...) 你真是一语惊醒梦中人,按您说的把问题解决了.谢谢了.

我想不通的是错误提示好像真正的错误要表达不一样了.可能是英语太差了吧.
lzwwiner 2004-12-07
  • 打赏
  • 举报
回复
to mhorse(火狮):
我已经按照你的方法试过了,编译还是以前一样的错误.我现大概不是这个原因吧.
错误中的vtable是不是和虚拟函数有关.
mhorse 2004-12-07
  • 打赏
  • 举报
回复

private slots:
void myShowInfo();
改为
public slots:
void myShowInfo();
你看可以吗?
lzwwiner 2004-12-07
  • 打赏
  • 举报
回复
To mhorse(火狮)
原文件就如下:
当我把
Q_OBJECT
private slots:
void myShowInfo();
和myShowInfo()的实现注消掉的时候就可以常运行了.


#include "mylabel.h"

#include <qapplication.h>
#include <qwidget.h>
#include <qlayout.h>
#include <qpixmap.h>
#include <qmessagebox.h>
#include <iostream>

using namespace std;


class MyWidget : public QWidget
{
Q_OBJECT

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

public:
myLabel *MyLabel;

private slots:
void myShowInfo();

};


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

QPixmap *myPim1=new QPixmap("./images/button1.gif","gif",1);
QPixmap *myPim2=new QPixmap("./images/button2.gif","gif",1);

MyLabel=new myLabel(this,"label",0,myPim1,myPim2);
myLabel *MyLabel1=new myLabel(this,"label1",0,myPim1,myPim2);
myLabel *MyLabel2=new myLabel(this,"label2",0,myPim1,myPim2);
myLabel *MyLabel3=new myLabel(this,"label3",0,myPim1,myPim2);
myLabel *MyLabel4=new myLabel(this,"label3",0,myPim1,myPim2);
myLabel *MyLabel5=new myLabel(this,"label4",0,myPim1,myPim2);
myLabel *MyLabel6=new myLabel(this,"label5",0,myPim1,myPim2);
myLabel *MyLabel7=new myLabel(this,"label6",0,myPim1,myPim2);
myLabel *MyLabel8=new myLabel(this,"label7",0,myPim1,myPim2);


setPaletteBackgroundColor(green);
QGridLayout *grid = new QGridLayout( this, 5, 5, 30 );
grid->addWidget(MyLabel, 1, 1 );
grid->addWidget(MyLabel1, 1, 2 );
grid->addWidget(MyLabel2, 1, 3 );

grid->addWidget(MyLabel3, 2, 1 );
grid->addWidget(MyLabel4, 2, 2 );
grid->addWidget(MyLabel5, 2, 3 );

grid->addWidget(MyLabel6, 3, 1 );
grid->addWidget(MyLabel7, 3, 2 );
grid->addWidget(MyLabel8, 3, 3 );

connect(MyLabel,SIGNAL(myClicked()),this,SLOT(close()) );
}

void MyWidget::myShowInfo()
{
QMessageBox *mb=new QMessageBox("AAAAAA","click me",
QMessageBox::NoIcon,
QMessageBox::Default,
QMessageBox::NoButton,
QMessageBox::NoButton);
mb->setMinimumSize( 100 ,70 );
mb->setMaximumSize( 100 ,70 );
mb->show();
}

int main(int argc ,char **argv)
{
QApplication myApp(argc,argv);
MyWidget *myWidget=new MyWidget(0,"label1");
myApp.setMainWidget(myWidget);
//myWidget->showFullScreen();全屏显示
//myWidget->setMouseTracking(TRUE);
myWidget->show();
return myApp.exec();
}
Jacode 2004-12-07
  • 打赏
  • 举报
回复
在h文件里只声明slot和添加Q_OBJECT,所有定义都在cpp文件里实现。
我在windows下用vc编写时如果不严格区分开声明和定义当含有Q_OBJECT时有时会出错,不知Linux下会不会这样。
mhorse 2004-12-07
  • 打赏
  • 举报
回复
发到这里snfmtc@163.com
lzwwiner 2004-12-07
  • 打赏
  • 举报
回复
编译产生了mylabel.h(我的另外一个类) 对应的moc文件.
要不你把邮箱给我,我发邮件给你好了.
mhorse 2004-12-07
  • 打赏
  • 举报
回复
编译了产生的moc文件了吗?
mhorse 2004-12-06
  • 打赏
  • 举报
回复
把类MyWidget的源文件,头文件贴出来

23,121

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧