我从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中做到这一点。
答案 0 :(得分:2)
Qt对QGraphicsItem
:qgraphicsitem_cast
有自己的投射功能。来自文档:
T qgraphicsitem_cast(QGraphicsItem * item)
如果item类型为T,则返回给定项目强制类型为T;否则,返回0。
注意:要使此功能与自定义项一起正常工作,请为每个自定义QGraphicsItem子类重新实现type()函数。
另一方面,糟糕的设计很糟糕,但dynamic_cast
有多糟糕取决于你如何使用它: - )