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 Qt c++,则更改光标
调整 QGraphicsRectItem 的大小和重新绘制的 PyQt 问题
QGraphicsRectItem.boundingRect() 在移动期间未更新