请注意以下评论itemChange
:
请注意,发送此通知时,新子代可能未完全构建;在子节点上调用纯虚函数可能会导致崩溃。
dynamic_cast
如果对象未完全构造,也可能失败。(我不太了解这方面的规范,但在某些情况下会,在某些情况下不会。)如果您在构建项目后设置父项,它将起作用:
#include <QtGui>
class MyGraphicsItem : public QGraphicsRectItem {
public:
MyGraphicsItem(QGraphicsItem *parent, QGraphicsScene *scene)
: QGraphicsRectItem(0.0, 0.0, 200.0, 200.0, parent, scene) {
setBrush(QBrush(Qt::red));
}
protected:
QVariant itemChange(GraphicsItemChange change, const QVariant &value) {
if (change == QGraphicsItem::ItemChildAddedChange) {
QGraphicsItem* item = value.value<QGraphicsItem*>();
if (item) {
MyGraphicsItem* my_item=dynamic_cast<MyGraphicsItem*>(item);
if (my_item) {
qDebug() << "successful!";
}
}
}
return QGraphicsRectItem::itemChange(change, value);
}
};
int main(int argc, char **argv) {
QApplication app(argc, argv);
QGraphicsScene scene;
MyGraphicsItem *item = new MyGraphicsItem(NULL, &scene);
// This will work.
MyGraphicsItem *item2 = new MyGraphicsItem(NULL, &scene);
item2->setParentItem(item);
// // This will not work.
// MyGraphicsItem *item2 = new MyGraphicsItem(item, &scene);
QGraphicsView view;
view.setScene(&scene);
view.show();
return app.exec();
}