1

我继承了一个名为GraphicsPixmapItemfrom的类QGraphicsPixmapItem,以便覆盖/创建一些鼠标事件。问题是我想在执行一些计算后发出一个信号,但除非执行一些黑客攻击,否则它看起来是不可能的,因为这个类不是QObject.

为此,我也尝试过继承上述新类QObject,但我不断收到编译器错误。

我的尝试:

头文件(graphicspixmapitem.h):

#ifndef GRAPHICSPIXMAPITEM_H
#define GRAPHICSPIXMAPITEM_H
#include <QObject>
#include <QGraphicsPixmapItem>
#include <QGraphicsSceneMouseEvent>

class GraphicsPixmapItem : public QObject, public QGraphicsPixmapItem
{
    Q_OBJECT
public:
    explicit GraphicsPixmapItem(QGraphicsItem *parent = 0);
    virtual void mousePressEvent(QGraphicsSceneMouseEvent * mouseEvent);
    virtual void mouseReleaseEvent(QGraphicsSceneMouseEvent * mouseEvent);
signals:
    void translationVector(QPointF info);
};

#endif // GRAPHICSPIXMAPITEM_H

源文件(graphicspixmapitem.cpp):

#include "graphicspixmapitem.h"

GraphicsPixmapItem::GraphicsPixmapItem(QGraphicsItem *parent) :
    QGraphicsPixmapItem(parent)
{

}

void GraphicsPixmapItem::mousePressEvent(QGraphicsSceneMouseEvent * mouseEvent)
{
    //Code
}

void GraphicsPixmapItem::mouseReleaseEvent(QGraphicsSceneMouseEvent * mouseEvent)
{
    QPointF info;
    //Code
    emit(translationVector(info));
}

我收到以下链接器错误:

未定义对“GraphicsPixmapItem 的 vtable”的引用

对“GraphicsPixmapItem::translationVector(QPointF)”的未定义引用

关于如何进行相应的任何线索?

边注:

我知道这QGraphicsObject可能是一个不错的选择,但正如这里所讨论的,性能看起来会受到使用它们时发出的信号量的严重影响,其中大多数不会在我的情况下使用。这就是为什么我更喜欢使用 baseQGraphicsItem而不是QGraphicsObject.

提前谢谢了。

4

2 回答 2

2

看起来元对象编译器 (moc) 没有在代码上运行,或者链接时没有包含 moc 的结果。

  • 您是否将 graphicspixmapitem.h 添加到 qmake 的HEADERS变量中?
  • 你有没有重新运行 qmake 并尝试过一个干净的构建?
  • moc 是否在 graphicspixmapitem.h 上运行?检查你的编译日志。
  • 链接时是否包含 graphicspixmapitem_moc.o?检查你的编译日志。
于 2017-06-30T15:44:28.157 回答
2

我终于发现了涉及链接错误的问题。从这个意义上说,我必须感谢 Thomas McGuire 指出了寻找问题根源的关键思想。

原因是几天前我尝试QGraphicsPixmapItem使用与此名称完全相同的名称(即GraphicsPixmapItem(带有头文件graphicspixmapitem.h和源文件))进行子类化(出于其他目的graphicspixmapitem.cpp)。

当我这样做时,我终于发现我可以用不同的方式做事,我不再需要继承的子类,因此我从项目中删除了这些文件。但是,如果您在从项目中删除文件之前没有确保清理项目,那么这样做是一个重大错误,因为qmakemoc( *.o, moc_*.cpp, moc_*.o) 生成的文件将保留在 build/debug 目录中,除非您手动删除它们,因为他们不会被清理项目删除。

因此,看起来在那种情况下,qmake检测到文件已经存在并且它没有从更新的类中生成正确的文件,从而导致上面阐述的链接错误。

总之,如果您要从项目中删除一些文件,请确保事先清理它,特别是如果您要使用Q_OBJECT宏删除一个类。

于 2017-06-30T16:48:48.990 回答