• 7162阅读
  • 6回复

MOC编译问题,急 [复制链接]

上一主题 下一主题
离线goodbay
 
只看楼主 倒序阅读 楼主  发表于: 2008-04-26
— 本帖被 XChinux 执行加亮操作(2008-04-27) —
用VI  h8.h
#ifndef MYMAINWIDGET_H
#define MYMAINWIDGET_H

#include <qmainwindow.h>
#include <qwidget.h>
#include<qpushbutton.h>
#include<qwidgetstack.h>
class MyMainWidget: public QWidget
{
    Q_OBJECT

public:
  MyMainWidget();
private:
  QWidgetStack *widgetstack;
    QPushButton *b1,*b2, *cb1,*cb2;
public slots:
    void showb1();
    void showb2(); 
};
#endif

==========================================================
在用vi mystack.cpp
#include "h8.h"
#include <qpushbutton.h>
#include <qwidgetstack.h>

MyMainWidget::MyMainWidget()

    setGeometry(100,100,150,130);
      widgetstack= new QWidgetStack(this);
      widgetstack->setGeometry(10,10,130,80);
 
 
      b1 = new QPushButton("Button1", this);
      b2 = new QPushButton("Button2", this);
 
      widgetstack->addWidget(b1,1);
      widgetstack->addWidget(b2,2);
 
      cb1 = new QPushButton("Raise b1", this);
      cb1->setGeometry(10,100,60,20);
      cb2 = new QPushButton("Raise b2", this);
      cb2->setGeometry(80,100,60,20);
      connect(cb1,SIGNAL(clicked()),this,SLOT(showb1()));
      connect(cb2,SIGNAL(clicked()),this,SLOT(showb2()));
};

void MyMainWidget::showb1()
{
  widgetstack->raiseWidget(b1);
}

void MyMainWidget::showb2()
{
  widgetstack->raiseWidget(b2);
}
要怎么编译啊,哪位能告诉我一下,步骤帮我写出来好吗
离线goodbay
只看该作者 1楼 发表于: 2008-04-26
怎么没人指导一下我啊.............................
离线ipromiseu
只看该作者 2楼 发表于: 2008-04-26
请参考本文介绍:
http://blog.cnwing.net/more.asp?name=linuxroot&id=267241
如果还有疑问,请联系我:
msn:guohui.great@hotmail.com
QQ:524071114
离线goodbay
只看该作者 3楼 发表于: 2008-04-27
加我的QQ17910645
你拒绝别人加你为好友
离线goodbay
只看该作者 4楼 发表于: 2008-04-27
求好心的人,帮一下好吗?千分感谢
离线ipromiseu
只看该作者 5楼 发表于: 2008-05-10
你好,你的问题解决 了吗?不用加QQ,你参考一下:
这个问题的说法不一,解决方法也各有不同,希望如下方法可以给你带来帮助:
 某一个类中如果加入Q_OBJECT后,则link时提示:undefined reference to vtable for"xxx::xxx",删掉它则没有任何问题.
-----------------------------------------------------------------------
    因为qmake生成Makefile的时候,这个类的头文件中并没有Q_OBJECT,所以在相应的Makefile里面并没有用moc xxx.h命令,最终导致链接失败.重新运行qmake -project,问题解决。
-----------------
在查找解决方法的时候,附带发现一点:
qmake 不会处理.cpp文件里的Q_OBJECT,所以,如果在.cpp文件中有它的话,也会产生undefined reference to vtable for "xxx::xxx". 这时,需要先用moc xxxx.cpp生成相应的moc文件,再包含到.cpp里面去,才能解决这个问题。 不过最好还是在头文件里包含就ok了。

这里可以发现问题的出现是因为没有moc生成相应的moc文件,之后连接就出问题。我找了好多源码之类的问题,就是没有找pro的错误,后来想到qt中moc我们是有make做的,qt的make编译是根据Makefile来的,而Makefile是由pro文件来的。这才想到了找pro文件的错误。
离线brightcat1
只看该作者 6楼 发表于: 2008-09-19
下面是我写的程序:是可以运行的:
//widgetstack.h
#ifndef WIDGETSTACK_H
#define WIDGETSTACK_H
#include<qwidget.h>
#include<qwidgetstack.h>
#include<qpushbutton.h>
class MyMainWindow:public QWidget
{
    Q_OBJECT
public:
    MyMainWindow();
private:
    QWidgetStack *widgetstack;
    QPushButton *b1,*b2,*cb1,*cb2;
public slots:
    void showb1();
    void showb2();
};
#endif
//widgetstack.cpp
#include"widgetstack.h"
void MyMainWindow::showb1(){
    widgetstack->raiseWidget(b1);
}
void MyMainWindow::showb2(){
    widgetstack->raiseWidget(b2);
}
MyMainWindow::MyMainWindow()
{
    setGeometry(100,100,150,130);
    widgetstack=new QWidgetStack(this);
    widgetstack->setGeometry(10,10,130,80);
    b1=new QPushButton("Button 1",this);
    b2=new QPushButton("Button 2",this);
    widgetstack->addWidget(b1,1);
    widgetstack->addWidget(b2,2);
    cb1=new QPushButton("Raise b1",this);
    cb1->setGeometry(10,100,80,20);
    cb2=new QPushButton("Raise b1",this);
    cb2->setGeometry(80,100,60,20);
    connect(cb1,SIGNAL(clicked()),this,SLOT(showb1()));
    connect(cb2,SIGNAL(clicked()),this,SLOT(showb2()));
}
//main.cpp
#include<qapplication.h>
#include"widgetstack.h"
int main(int argc,char **argv)
{
    QApplication a(argc,argv);
    MyMainWindow w;
    a.setMainWidget(&w);
    w.show();
    a.exec();
}
//注:当我把这几个程序合到一个cpp文件时会有问题,不知是为什么,会提示:undefined reference to vtable for"xxx::xxx"
[ 此贴被brightcat1在2008-09-19 16:12重新编辑 ]
快速回复
限100 字节
 
上一个 下一个