Как реализовать сигнал и слоты в QGraphicsRectItem?подкласс qobject и qgraphicsrectitem, но получаю ошибки - PullRequest
0 голосов
/ 13 ноября 2018

Я создаю объект из QGraphicsRectItem и добавляю к Qgraphicscene(scene). Я хочу получить каждый movement(pos) объекта (qgraphicsrectitem), чтобы я поместил в подкласс Qgraphicsrectitem. Но в этом классе я получаю некоторые ошибки. Как я могу изменить положение объекта в сцене?

ошибка:

staticMetaObject не является членом QGraphicsRectItem {&QGraphicsRectItem::staticMetaObject, qt_meta_stringdata_ItemHandler.data

ItemHandler.h

#include <QObject>
#include <QGraphicsRectItem>

class ItemHandler : public QGraphicsRectItem, public QObject
{
 Q_OBJECT

   public:
      ItemHandler(QGraphicsItem *parent = 0 );
     ~ItemHandler();

   protected:
      QVariant itemChange(GraphicsItemChange change, const QVariant &value);

   signals:
      void objectHandlePosChanged(QPointF value);
 };

ItemHandler.cpp

  #include "itemhandler.h"

 ItemHandler::ItemHandler(QGraphicsItem *parent) : QGraphicsRectItem(parent)
 {
     setFlag(QGraphicsItem::ItemSendsGeometryChanges);
 }

 ItemHandler::~ItemHandler()
 {

 }

 QVariant ItemHandler::itemChange(QGraphicsItem::GraphicsItemChange change, 
 const QVariant &value)
 {
        QPointF newPos = value.toPointF();
       emit objectHandlePosChanged(newPos);
 }

1 Ответ

0 голосов
/ 13 ноября 2018

В вашем заголовочном файле сначала наследуйте от QObject, как показано ниже:

#include <QObject>
#include <QGraphicsRectItem>

class ItemHandler : public QObject, public QGraphicsRectItem
{
 Q_OBJECT

   public:
      ItemHandler(QGraphicsItem *parent = 0 );
     ~ItemHandler();

   protected:
      QVariant itemChange(GraphicsItemChange change, const QVariant &value);

   signals:
      void objectHandlePosChanged(QPointF value);
 };

И это моя основная тестовая функция (извините, это просто песочница):

int main(int argc, char *argv[])

{

    QApplication app(argc, argv);

    MainWindow* mywindow = new MainWindow();

    QGraphicsScene scene;
    ItemHandler *item = new ItemHandler;
    item->setRect(10.0, 10.0, 10.0, 10.0);

    scene.addItem(item);

    QApplication::connect(item, SIGNAL(objectHandlePosChanged(QPointF)), mywindow, SLOT(moved(QPointF)));

    QGraphicsView view(&scene);
    view.setFixedSize(250, 250);
    view.setWindowTitle("QGraphicsItem Test");
    item->setPos(-100, -100);
    item->setPos(-200, -200);
    view.show();
    return app.exec();

}

Я просто использовал пустое MainWindow, которое никогда не отображается, чтобы иметь слот для подключения к сигналу, нет смысла иметь MainWindow: оно уже было там, и я изменил его вместо создания нового класса. Пример работает, запускает сигнал и отображает прямоугольник.

...