Qt / C ++将QGraphicsItem转换为自定义QGraphicsItem而不使用dynamic_cast

时间:2016-01-13 05:09:45

标签: c++ qt object-oriented-analysis

我从OOAD课程中了解到dynamic_cast是一个糟糕的设计 但我不知道如果没有在Qt中的dynamic_cast,我怎么能做我想做的事 因为我不能在QGraphicsItem中做多态。 这是我的代码。

void Scene::changeName(){
    QList<QGraphicsItem*> selecitems = this->selectedItems();
    if(selectedItems().size()==1){
        Base* object = dynamic_cast<Base*>(selecitems[0]);
        bool isok;
        if(object){
            QString name = QInputDialog::getText( views().first()
                , tr("Change object name")
                , tr("Enter a name"),QLineEdit::Normal, "name", &isok);
            if(isok){
                object->setName(name);
            }
        }
    }
}

我想更改项目的名称,如果它是一个基础对象,并且是唯一选择的项目。

我需要函数&#34; setName&#34;在基类。 反正有没有使用dynamic_cast做我想做的事情?

在正常情况下,我会渗透功能&#34; SetName&#34;在QGraphicsItem中, 但似乎我无法在Qt中做到这一点。

1 个答案:

答案 0 :(得分:2)

Qt对QGraphicsItemqgraphicsitem_cast有自己的投射功能。来自文档:

  

T qgraphicsitem_cast(QGraphicsItem * item)

     

如果item类型为T,则返回给定项目强制类型为T;否则,返回0。

     

注意:要使此功能与自定义项一起正常工作,请为每个自定义QGraphicsItem子类重新实现type()函数。

另一方面,糟糕的设计很糟糕,但dynamic_cast有多糟糕取决于你如何使用它: - )