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

标签 c++ qt signals-slots qgraphicsscene qgraphicsitem

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

错误:

'staticMetaObject' is not a member of '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);
 }

最佳答案

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

关于c++ - 如何在 QGraphicsRectItem 中实现信号槽?子类化 qobject 和 qgraphicsrectitem 但出现错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53275699/

相关文章:

c++ - 如何在 C++ 中正确创建/实现拦截器库?

c++ - "clang -S -emit-llvm file.cpp"是否运行除 clang 之外的任何其他可执行文件?

c++ - QScrollArea 小部件未使用 Flowlayout 扩展

c++ - 如何在 Creator 中使用我的静态 Qt 构建?

qt - Qt:信号和插槽错误:未定义对`vtable的引用

c++ - EnhTableWidget 字段的值更改(返回前)时发出信号

c++ - 如何在c++中的开关中生成随机数

c++ - Curiously Recurring Template Pattern (CRTP) 是正确的解决方案吗?

c++ - 相同的着色器在 Nvidia 和 ATI 卡上表现不同

c++ - 如何让信号和槽在 Qt 中工作?