Qt: Сигналы и слоты в классе QGraphicsPixmapItem

Я унаследовал класс под названием 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

Исходный файл ( 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));
}

И я получаю следующие ошибки компоновщика:

неопределенная ссылка на `vtable для GraphicsPixmapItem'

неопределенная ссылка на GraphicsPixmapItem::translationVector(QPointF)

Любая подсказка о том, как действовать соответственно?

Примечание:

Я знаю что QGraphicsObject может быть хорошей альтернативой, но, как обсуждалось здесь, производительность выглядит сильно зависит от количества сигналов, которые излучаются при работе с ними, где большинство из них не будут использоваться в моем случае. Это причина, почему я предпочитаю создавать свой собственный класс с базой QGraphicsItem, вместо QGraphicsObject,

Спасибо заранее.

2 ответа

Я наконец обнаружил проблему, связанную с ошибкой связи. В этом смысле я должен поблагодарить Томаса Макгуайра за то, что он указал на ключевую идею по поиску источника проблемы.

Причина в том, что несколько дней назад я попытался создать подкласс QGraphicsPixmapItem (для других целей) с точно таким же именем, как это, а именно, GraphicsPixmapItem (с заголовочным файлом graphicspixmapitem.h и исходный файл graphicspixmapitem.cpp).

Когда я это сделал, я наконец понял, что могу делать что-то по-другому, и мне больше не нужен этот унаследованный подкласс, поэтому я удалил эти файлы из проекта. Но делать это является большой ошибкой, если вы не уверены, что очистили проект перед удалением файлов из проекта, потому что файлы, созданные qmake а также moc (*.o, moc_*.cpp, moc_*.o) останется в каталоге build/debug, если вы не удалите их вручную, потому что они не будут удалены при очистке проекта.

Таким образом, похоже, что в этой ситуации, qmake обнаруживает, что файлы уже существуют, и не генерирует правильные файлы из обновленного класса, вызывая ошибку компоновки, изложенную выше.

Таким образом, если вы собираетесь удалить некоторые файлы из своего проекта, обязательно очистите его ранее, особенно если вы собираетесь удалить класс с Q_OBJECT макро.

Похоже, что мета-объектный компилятор (moc) не был запущен поверх кода, или что результат moc не был включен при компоновке.

  • Вы добавили graphicspixmapitem.h в qmake HEADERS переменная?
  • Вы повторно запустили qmake и попробовали чистую сборку в целом?
  • Работает ли moc на graphicspixmapitem.h? Проверьте свой журнал компиляции.
  • Включается ли graphicspixmapitem_moc.o при линковке? Проверьте свой журнал компиляции.
Другие вопросы по тегам