c++ - Qt/C++ 在不使用 dynamic_cast 的情况下将 QGraphicsItem 转换为自定义 QGraphicsItem

标签 c++ qt object-oriented-analysis

我从 OOAD 类(class)中了解到 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);
            }
        }
    }
}

我想更改一个项目的名称,如果它是一个 Base 对象并且它是唯一被选中的对象。

我需要基类中的函数“setName”。 有没有办法在不使用 dynamic_cast 的情况下做我想做的事?

在正常情况下,我将在 QGraphicsItem 中渗透函数“SetName”, 但似乎我无法在 Qt 中执行此操作。

最佳答案

Qt 有自己的QGraphicsItem 转换函数:qgraphicsitem_cast。来自文档:

T qgraphicsitem_cast(QGraphicsItem * item)

Returns the given item cast to type T if item is of type T; otherwise, 0 is returned.

Note: To make this function work correctly with custom items, reimplement the type() function for each custom QGraphicsItem subclass.

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

关于c++ - Qt/C++ 在不使用 dynamic_cast 的情况下将 QGraphicsItem 转换为自定义 QGraphicsItem,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34758799/

相关文章:

c++ - 没有 return 语句的重载赋值运算符

qt - 单击时在 QWidget 上绘制矩形叠加层

cocoa - Qt mac开源库和qt mac cocoa库的区别

c++ - 酒店预订系统的面向对象设计

c++ - C++ 模板的类和类型名之间的区别

c++ - C/C++ 中的领域特定语言,这是 Kosher 吗?

c++ - 为什么 range::iota_view 的构造函数不将参数移动到成员变量?

c++ - Qt - 这些代码片段是什么意思

javascript - 如何从这个对象中提取数据?

java - 线程安全类与具有所有静态方法的实用程序类