【问题标题】:How to implement signal and slots in QGraphicsRectItem? subclassed qobject and qgraphicsrectitem but getting errorsQGraphicsRectItem中如何实现信号和槽?子类化 qobject 和 qgraphicsrectitem 但出现错误
【发布时间】: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);
 }

【问题讨论】:

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


    【解决方案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 的工作示例,希望对您有所帮助。下次请放一个最小的工作示例来重现问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-01
    • 1970-01-01
    • 2013-07-08
    • 2011-10-10
    • 1970-01-01
    相关资源
    最近更新 更多