为什么不与Q_OBJECT宏进行编译(链接)?

teu*_*kam 3 c++ linker qt qobject

我用PyQt制作了一个项目的原型并使其在那里工作,现在我正在尝试将其转换为C++并且遇到了一些问题.

如果我没有放入Q_OBJECT宏,它会编译并运行,但如果我将其注释掉,我会收到以下错误:

Undefined symbols:
  "vtable for MapView", referenced from:
      MapView::~MapView()in mapview.o
      MapView::~MapView()in mapview.o
      MapView::MapView(QObject*)in mapview.o
      MapView::MapView()in mapview.o
  "MapView::staticMetaObject", referenced from:
      MapView::MapView(QObject*)in mapview.o
      MapView::MapView()in mapview.o
Run Code Online (Sandbox Code Playgroud)

这是标题:

#ifndef MAPVIEW_H
#define MAPVIEW_H

#include <QtGui>
#include <QObject>

class MapView : public QGraphicsScene
{
    //Q_OBJECT

public:
    MapView();
    explicit MapView(QObject *parent = 0);
    QGraphicsPixmapItem *mappixmap;
    ~MapView();

private:
    bool dragging;
    float offsetX, offsetY, downoffsetX, downoffsetY;

protected:
    void mousePressEvent(QGraphicsSceneMouseEvent *event);
    void mouseMoveEvent(QGraphicsSceneMouseEvent *event);
    void mouseReleaseEvent(QGraphicsSceneMouseEvent *event);

};

#endif // MAPVIEW_H
Run Code Online (Sandbox Code Playgroud)

如果我在这里省略Q_OBJECT宏,那么第二个问题就是Bad Things会发生吗?

是的,我知道将QGraphicsScene称为"视图"是愚蠢的.

Job*_*Job 7

当您添加Q_OBJECT宏并忘记重新运行时,通常会发生这种错误moc.如果您使用qmake,只需make qmake在添加宏后运行.

至于你的第二个问题:没有Q_OBJECT宏,你将无法使用信号/插槽(以及其他内容).有关此内容的详细信息,请参阅文档.