Qt C ++ Q_OBJECT错误未定义对vtable的引用

时间:2017-01-13 08:52:43

标签: qt

我在使用Q_OBJECT宏时经常遇到问题:(我使用的是QT Creator 2.8.1 / Qt 4.8.4)之前我问过,但它似乎导致了更多麻烦。有谁能够帮我?我完全迷失了。

我有一个庞大的C ++程序,大约有50多个课程,以适应新的需求。 现在我在src-directory中的一个新目录中创建了一个新的(非常简单的)父类和3个子类。为此,我使用了模板 Qt-> Qt Designer Form Class。(我之所以这样做,因为即使我不需要* .ui文件,这也会自动实现Q_OBJECT。然后我删除了所有关于ui-File和ui文件本身))

当我运行我的程序时,我总是会得到很多“对于 ..-错误的vtable的u ndefined引用”。当我删除所有Q_OBJECT时,我的程序运行正常。但后来我无法使用以后需要的信号槽。

我在网上查了一下,发现它与我的build-directory中的.pro文件/ .o-Files有关。我(好几次)试图删除包括.pro.user在内的所有.o文件并再次编译。有时我仍然会得到错误,有时候不会。

这是我的代码(目前3个子类是相同的):

geometry.h:

    #ifndef GEOMETRY_H
    #define GEOMETRY_H
    #include <QMetaType>        
    #include <QWidget>
    #include <QObject>   
    #include <QDebug>        

    class Geometry
    {
        Q_OBJECT
    protected:

    public:
        Geometry();
        virtual ~Geometry(void) {}

        virtual void write_LNE(); 

    //Q_DECLARE_METATYPE(Geometry);
    #endif // GEOMETRY_H

-

geometry.cpp:

#include "geometry.h"

    Geometry::Geometry()
    { qDebug() << "Constructor:  hier ist Geometry";        }


    void Geometry::Haupt()
    {  qDebug() << " Das hier ist die Haupt von Geometry ....." ; }      
    void Geometry::write_LNE(){}

-

 Geo_1PF.h:

    #ifndef GEO_1PF_H
    #define GEO_1PF_H
    #include "geometry.h"

    class Geo_1PF : public Geometry
    {
        Q_OBJECT
    public:
        Geo_1PF();
        ~Geo_1PF() {}

        virtual void write_LNE();        
    };

    //Q_DECLARE_METATYPE(Geo_1PF);
    #endif // GEO_1PF_H
  • Geo_1PF.cpp:

     #include "Geo_1PF.h"
    
     Geo_1PF::Geo_1PF()
    {
    }
    

我找到了手动做qmake的建议。我从未手动使用过qmake。

  • 我是如何以及从哪个目录执行此操作的?究竟我怎么写qmake ......。
  • 使用模板Qt-&gt; Qt Designer Form Class创建这些类是否正确?
  • 我是否必须在其他目录中创建课程?

  • 我必须在+ .pro文件中添加任何其他条目

  • 以及文件中的位置是否可以放置?

  • 我是否必须更改makefile中的任何内容?如果是这样的话?

谢谢

2 个答案:

答案 0 :(得分:1)

要在类中使用QOBJECT宏,您需要扩展QObject。

class MyObject: public QObject
{
Q_OBJECT

public:
MyObject (QObject *_parent);

.....

};

答案 1 :(得分:1)

如果你使用Qt Creator: 每次使用Q_OBJECT创建一个类时,

  • 构建→运行qmake

  • 构建→全部重建