在itemChange的函数中,首先,我得到将要添加的子项,然后我使用dynamic_cast将其转换为'MyItem',但是转换总是失败。
QVariant MyItem::itemChange ( GraphicsItemChange change, const QVariant & value )
{
if (change==ItemChildAddedChange)
{
QGraphicsItem* item=value.value<QGraphicsItem*>();
if (item)
{
MyItem* myItem=dynamic_cast<MyItem*>(item);//myItem always be NULL,
//although I know the item is 'MyItem' type.
if (myItem)
{
qDebug()<<"successful!";
}
}
}
return QGraphicsItem::itemChange(change,value);
}
非常感谢!
答案 0 :(得分:3)
请注意itemChange
上的评论:
如果对象未完全构造,请注意,此时可能无法完全构建新子项 发送通知;在孩子身上调用纯虚函数可以 导致崩溃。
dynamic_cast
也会失败。 (我不太明白这方面的规范,但有些情况会发生,有些情况不会。)如果在构建项目之后设置父,它将起作用:< / p>
#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();
}
答案 1 :(得分:0)