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

Posted

技术标签:

【中文标题】QGraphicsRectItem中如何实现信号和槽?子类化 qobject 和 qgraphicsrectitem 但出现错误【英文标题】:How to implement signal and slots in QGraphicsRectItem? subclassed qobject and qgraphicsrectitem but getting errors 【发布时间】:2018-11-13 07:14:27 【问题描述】:

我正在从QGraphicsRectItem 创建对象并添加到Qgraphicscene(scene)。 我想获取对象(qgraphicsrectitem)的每个movement(pos),以便我对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】:

在你的头文件中,首先继承自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 没有意义:它已经存在并且我对其进行了修改而不是创建一个新类。该示例有效,触发信号并显示矩形。

【讨论】:

感谢您的快速回复..我在添加到场景后尝试了这个,它没有显示矩形。通过调试了解构造函数给出 qObject ptr 而不是 qgraphicsrectitem 指针 我试过了,它可以工作并触发 objectHandlePosChanged 信号。除非您发布完整的工作示例等,否则我无法提供更多帮助。 你可以发布...在您的示例中创建实例并连接...2行代码 我添加了一个关于如何创建和连接您的 ItemHandler 的工作示例,希望对您有所帮助。下次请放一个最小的工作示例来重现问题。

以上是关于QGraphicsRectItem中如何实现信号和槽?子类化 qobject 和 qgraphicsrectitem 但出现错误的主要内容,如果未能解决你的问题,请参考以下文章

QGraphicsRectItem 的几何形状

如果传递给 QGraphicsRectItem Qt c++,则更改光标

调整 QGraphicsRectItem 的大小和重新绘制的 PyQt 问题

QGraphicsRectItem.boundingRect() 在移动期间未更新

QGraphicsView Scale & QGraphicsRectItem 绘画未能调用

无法通过鼠标单击移动 QGraphicsRectItem