首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在QGraphicsRectItem中实现信号和时隙?子类qobject和qgraphicsrectitem但得到错误

如何在QGraphicsRectItem中实现信号和时隙?子类qobject和qgraphicsrectitem但得到错误
EN

Stack Overflow用户
提问于 2018-11-13 07:14:27
回答 1查看 202关注 0票数 0

我正在从QGraphicsRectItem创建对象并添加到Qgraphicscene(scene)中。我希望得到每个对象的movement(pos) (qgraphicsrectitem),以便子类Qgraphicsrectitem。但是在这节课上,我遇到了一些错误。如何在场景中改变物体的位置?

错误:

'staticMetaObject‘不是'QGraphicsRectItem’( &QGraphicsRectItem::staticMetaObjectqt_meta_stringdata_ItemHandler.data )的成员

ItemHandler.h

代码语言:javascript
复制
#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

代码语言:javascript
复制
  #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);
 }
EN

回答 1

Stack Overflow用户

发布于 2018-11-13 08:38:15

在头文件中,首先从QObject继承,如下所示:

代码语言:javascript
复制
#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);
 };

这是我的测试主要功能(抱歉,它只是一个沙箱):

代码语言:javascript
复制
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:它已经在那里了,我修改了它,而不是创建一个新的类。该示例工作正常,触发信号并显示矩形。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53275699

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档