正在重写QObject::setProperty
Overriding QObject::setProperty
我想重写QObject::setProperty(const char*, QVariant)
,因为当我用包含QVariantList
的QVariant
调用此方法时,该方法会失败,因为它没有将QVariantList
转换为QList<UnknownType>
。
有什么建议吗?
编辑
我有一个包含的抽象类Node
Context* _context; QMap<QString, QString> _inputsPersisted; QMap<QString, QString> _outputsPersisted;
Node
类还有一个virtual void runImplementation()
和方法void run()
,如下所示:
void Node::run() { //get inputs from Context for(QMap<QString, QString>::iterator it = _inputsPersisted.begin() ; it != _inputsPersisted.end() ; ++it ) { QVariant attribute = property(it.key().toStdString().c_str()); if(!attribute.isValid()) { qWarning() << QObject::tr("%1:%2: Node::run:%3: the property %4 does not exist.").arg(__FILE__).arg(__LINE__).arg(_id.toString()).arg(it.key()); } else { QVariant v = _context->getDataPersisted(it.value()); if(!v.isValid()) qWarning() << QObject::tr("%1:%2: Node::run:%3: %4 is not in the context.").arg(__FILE__).arg(__LINE__).arg(_id.toString()).arg(it.value()); else if(v.type() != attribute.type()) qWarning() << QObject::tr("%1:%2: Node::run:%3: %4 and %5 have not the same type.").arg(__FILE__).arg(__LINE__).arg(_id.toString()).arg(it.key()).arg(it.value()); else if(!setProperty(it.key().toStdString().c_str(), v)) qWarning() << QObject::tr("%1:%2: Node::run:%3: the property %4 have not been setted.").arg(__FILE__).arg(__LINE__).arg(_id.toString()).arg(it.key()); } } runImplementation(); //set outputs in the Context for(QMap<QString, QString>::iterator it = _outputsPersisted.begin() ; it != _outputsPersisted.end() ; ++it ) { QVariant attribute = property(it.key().toStdString().c_str()); if(!attribute.isValid()) { qWarning() << QObject::tr("%1:%2: Node::run:%3: the property %4 does not exist.").arg(__FILE__).arg(__LINE__).arg(_id.toString()).arg(it.key()); } else { _context->setDataPersisted(it.value(), attribute); } }
}
Context
类如下:
class Context : public QObject { Q_OBJECT public: Context(Context* parent = NULL) : : _parent(parent){} void setDataPersisted(QString name, QVariant value) { if(_parent != NULL && _parent->exist(name)) _parent->setDataPersisted(name, value); else { if(_stack.contains(name)) _stack.insert(name, value); else _stack.insert(name, value); } } QVariant getDataPersisted(QString name) { QVariant v; QMap<QString, QVariant>::iterator it = _stack.find(name); if(it != _stack.end()) v.setValue(it.value()); else if(_parent != NULL) v.setValue(_parent->getDataPersisted(name)); return v; } private: bool exist(QString name) { bool contains = _stack.contains(name); return contains || ((_parent != NULL) && (_parent->exist(name))); } private: Context * _parent; QMap<QString, QVariant> _stack; };
有了这个,Node
子类可以在她的Context
中放入和获取一些变量,而这只需要声明她的属性并初始化_inputsPersisted
和_outputsPersisted
。所有的逻辑都是由Node
类完成的。
现在我想添加一个机制。我想在Context
中操作列表并执行append
。为此,我修改了Context::setDataPersisted
方法:
void setDataPersisted(QString name, QVariant value) { if(_parent != NULL && _parent->exist(name)) _parent->setDataPersisted(name, value); else { if(_stack.contains(name) && _stack.find(name)->value().canConvert(QVariant::List)) { QVariantList toChange = qvariant_cast<QVariantList>(_stack.find(name)->value()); toChange.append(value); _stack.insert(name, toChange ); } else _stack.insert(name, value); } }
这样,在setDataPersited
、另一个setDataPersisted
("附加")和getDataPersisted
之后,数据的列表就会损坏。
使用Q_DECLARE_METATYPE
宏在Qt元类型系统中注册QVariantList
。这将允许将QVariantList
存储为QVariant
Q_DECLARE_METATYPE(QVariantList);
...
QVariantList var;
QVariant v = QVariant::fromValue<QVariantList>( var );
QVariantList lst = v.value<QVariantList>();
将QList<SomeType>
转换为QVariantList
:
QList<SomeType> lst1;
...
QVariantList lst2;
for (const SomeType& st : lst1)
lst2.append( QVariant::fromValue<SomeType>( st ) );
将QVariantList
转换为QList<SomeType>
:
QVariantList lst2;
...
QList<SomeType> lst1;
for (const QVariant& st : lst2)
lst2.append( st.value<SomeType>() );
编辑1:
auto it = _stack.find(name);
if (_stack.end() == it) {
it = _stack.insert( name, QVariant::fromValue<QVariantList>(QVariantList()) );
}
QVariantList toChange = it->value().value<QVariantList>();
toChange.append(value);
_stack.insert(name, QVariant::fromValue<QVariantList>(toChange) );
相关文章:
- 删除 QSharedPointer 指向的 QObject
- QObject::连接无法将信号连接到*this*对象的插槽
- 调试符号中缺少 QObject 类信息(编辑但存在其他 Qt 类)
- QML/C++/QObject Struct Copy
- QObject::d eleteLater在我的Qt测试中没有像预期的那样调用
- 具有 QObject 继承的单例 - Qt
- QObject::连接不起作用 - 使用函数语法找不到信号
- 是否可以在单独的线程中将 QObject 设置为 QML 上下文属性?
- 智能指针作为 QObject::d eleteLater() 的替代品
- Shiboken2 qobject.h:46:10:致命:找不到'QtCore/qobjectdefs.h'文件
- 在 dll 中为 qLibrary 编译 qobject 时出错
- 将复制构造函数设置为默认值在继承自 QObject 时不起作用
- 我应该使用多个角色还是一个角色,将实际属性推迟到将数据包装/公开为其属性的QObject
- 在另一个线程上发出 QObject 信号的正确方法?
- 为什么 QObject::d isconnect(const QMetaObject::Connection &connection) 采用 const 参数并打算修改它?
- 在 QObject 方法中生成 QWidgets
- 我可以自动处理继承 QObject 的仅标头对象吗?
- QT 库 QObject::connect: 无法连接 (null)::done() 到 MainWindow::upd
- QObject::connect 有太多的参数
- 正在重写QObject::setProperty