如何在QGraphicsRectItem中实现信号和插槽?子类化了qobject和qgraphicsrectitem但出现错误

时间:2018-11-13 07:14:28

标签: c++ qt signals-slots qgraphicsscene qgraphicsitem

我正在从QGraphicsRectItem创建对象并将其添加到Qgraphicscene(scene)。 我想获取对象{movement(pos))的每个qgraphicsrectitem,以便子类化Qgraphicsrectitem。但是在这堂课中,我遇到了一些错误。 如何在场景中更改对象位置?

错误:

  

“ staticMetaObject”不是“ QGraphicsRectItem”的成员        {&QGraphicsRectItem::staticMetaObjectqt_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 :(得分:1)

在头文件中,首先从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毫无意义:它已经在那里并且我修改了它而不是创建一个新类。该示例有效,触发信号并显示矩形。