2016-01-13 3 views
0

Я узнал из класса OOAD, что dynamic_cast - плохой дизайн , но я не знаю, как я могу сделать то, что хочу, без dynamic_cast в Qt , потому что я не могу просто полиморфизм в QGraphicsItem. Вот мой код.Qt/C++ Листинг QGraphicsItem для пользовательского QGraphicsItem без использования dynamic_cast

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); 
      } 
     } 
    } 
} 

Я хочу изменить имя элемента, если это базовый объект и его единственный выбранный.

И мне нужна функция «setName» в базовом классе. Есть ли способ сделать то, что я хочу, не используя dynamic_cast?

В нормальном состоянии, я буду просачивать функцию «SetName» в QGraphicsItem, , но кажется, что я не могу сделать это в Qt.

+0

Просто, чтобы проверить, если я правильно понимаю: 'Base' является _derived_ от' QGraphicsItem' ?! – MSalters

+0

Да, это правильно! – Richard

ответ

2

Qt имеет собственную функцию литья для QGraphicsItem: qgraphicsitem_cast. Из документации:

T qgraphicsitem_cast (QGraphicsItem * пункт)

Возвращает заданный элемент преобразованный к типу T, если элемент имеет тип Т; в противном случае возвращается 0.

Примечание. Чтобы эта функция работала правильно с пользовательскими элементами, переопределите функцию type() для каждого пользовательского подкласса QGraphicsItem.

На другой ноте, плохой дизайн плох, но как плохо dynamic_cast это зависит от того, как вы его используете :-)

+0

Какая разница между использованием qgraphicsitem_cast и dynamic_cast? – Richard

+0

Я думаю, что 'qgraphicsitem_cast' использует' dynamic_cast' под капотом, но я его не проверял. В принципе, это безопаснее, поскольку 'qgraphicsitem_cast' проверяет, вернула ли функция' type() 'id, которая равна' DerivedQGraphicsItem :: Type' перед литьем. –

+0

@LebenAsa: Если он использовал 'dynamic_cast', не было бы необходимости в' type() '. Qt предшествует достойным компиляторам C++ и предполагалось, что RTTI был сломан. – MSalters

Смежные вопросы