QT6.4.3中QMetaType::type函数的替代方案是什么?
QT6.4中QMetaType废弃API的替代方案
原代码与警告问题
原通过类型名创建对象的代码:
class BotModel : public QObject { ... } using BotPtr = std::shared_ptr<BotModel>; BotPtr MakeBot(QString type_name) { const std::string full_name = format() << type_name << "*"; const int id = QMetaType::type(full_name.c_str()); auto metaObject = QMetaType::metaObjectForType(id); QObject* p_instance = metaObject->newInstance(); BotModel* raw_p = qobject_cast<BotModel*>(p_instance); BotPtr bot(raw_p); bot->onCreated(); return bot; }
在QT6.4 + MSVC编译时出现以下警告:
warning C4996: 'QMetaType::type': was declared deprecated warning C4996: 'QMetaType::metaObjectForType': was declared deprecated
替代方案
QT6.4中QMetaType::type()和QMetaType::metaObjectForType()已被废弃,推荐使用QMetaType::fromName()获取类型实例,再通过实例调用相关方法。修改后的代码如下:
class BotModel : public QObject { ... } using BotPtr = std::shared_ptr<BotModel>; BotPtr MakeBot(QString type_name) { const std::string full_name = format() << type_name << "*"; // 替代QMetaType::type(),直接获取QMetaType实例 QMetaType metaType = QMetaType::fromName(full_name.c_str()); // 先校验类型是否有效 if (!metaType.isValid()) { return nullptr; // 或者根据需求处理无效类型的情况 } // 替代QMetaType::metaObjectForType(),从QMetaType实例获取元对象 const QMetaObject* metaObject = metaType.metaObject(); if (!metaObject) { return nullptr; } QObject* p_instance = metaObject->newInstance(); if (!p_instance) { return nullptr; } BotModel* raw_p = qobject_cast<BotModel*>(p_instance); if (!raw_p) { delete p_instance; // 类型转换失败时释放内存 return nullptr; } BotPtr bot(raw_p); bot->onCreated(); return bot; }
关键修改点说明
- 用
QMetaType::fromName()替代QMetaType::type():直接返回QMetaType对象而非类型ID,更直观且避免无效ID的后续处理 - 用
QMetaType::metaObject()替代QMetaType::metaObjectForType():从有效的QMetaType实例直接获取元对象 - 增加多步有效性校验:避免无效类型、空元对象、实例创建失败、类型转换失败等场景导致的崩溃
内容的提问来源于stack exchange,提问作者Alexey Starinsky
相关产品推荐
相关产品推荐

