我从> mydata$column1<-c("Apple","Apple","Banana","Banana","Pear","Pear","Car","Car","Car")
继承了一个名为> mydata$column1<-gsub('.*Apple.*','Apple',mydata$column1)
> mydata$column1<-gsub('.*Banana.*','Banana',mydata$column1)
> mydata$column1<-gsub('.*Pear.*','Pear',mydata$column1)
> mydata$column1<-gsub('.*Car.*','Car',mydata$column1)
的类,以便覆盖/创建一些鼠标事件。问题是我想在执行一些计算后发出一个信号,但看起来除非执行了一些黑客攻击,否则它是不可能的,因为这个类不是GraphicsPixmapItem
。
为此,我尝试从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
我收到以下链接器错误:
未定义对'vtable for GraphicsPixmapItem'的引用
未定义的引用 `GraphicsPixmapItem :: translationVector(QPointF)'
有关如何进行相应处理的任何线索?
旁注:
我知道graphicspixmapitem.cpp
可能是一个不错的选择,但正如here所讨论的那样,性能看起来受到与它们一起操作时发出的信号量的严重影响,其中大多数信号不会在我的情况下使用。这就是为什么我更喜欢使用基础#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));
}
而不是QGraphicsObject
创建自己的类。
非常感谢提前。
答案 0 :(得分:1)
看起来元对象编译器(moc)没有在代码上运行,或者在链接时没有包含moc的结果。
HEADERS
变量中?答案 1 :(得分:1)
我终于找到了涉及链接错误的问题。从这个意义上讲,我必须感谢Thomas McGuire指出寻找问题根源的关键思路。
原因是前几天我尝试将QGraphicsPixmapItem
(用于其他目的)子类化为与此名称完全相同的名称,即GraphicsPixmapItem
(带有头文件graphicspixmapitem.h
和源文件graphicspixmapitem.cpp
)。
当我这样做时,我终于发现我可以用不同的方式做事情,我不再需要继承的子类,因此我从项目中删除了这些文件。但是,如果在从项目中删除文件之前不确保清理项目,那么这样做是一个重大错误,因为qmake
和moc
生成的文件(*.o
,{{ 1}},moc_*.cpp
)将保留在构建/调试目录中,除非您手动删除它们,因为它们不会通过清理项目来删除。
因此,在这种情况下,moc_*.o
检测到文件已经存在,并且它不会从更新的类中生成正确的文件,从而导致上面的链接错误。
总之,如果您要从项目中删除某些文件,请务必先清除它,特别是如果您要删除具有qmake
宏的类。