Qt:QGraphicsPixmapItem类中的信号和插槽

时间:2017-06-30 15:34:49

标签: qt signals-slots qgraphicsitem qobject qgraphicspixmapitem

我从> 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创建自己的类。

非常感谢提前。

2 个答案:

答案 0 :(得分:1)

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

  • 您是否已将graphicspixmapitem.h添加到qmake的HEADERS变量中?
  • 您是否重新运行qmake并尝试了一般的干净构建?
  • moc是否在graphicspixmapitem.h上运行?检查编译日志。
  • 链接时是否包含graphicspixmapitem_moc.o?检查编译日志。

答案 1 :(得分:1)

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

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

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

因此,在这种情况下,moc_*.o检测到文件已经存在,并且它不会从更新的类中生成正确的文件,从而导致上面的链接错误。

总之,如果您要从项目中删除某些文件,请务必先清除它,特别是如果您要删除具有qmake宏的类。