我想重写QObject::setProperty(const char*, QVariant),因为当我用包含QVariantList的QVariant调用该方法时,该方法会失败,因为它不会将QVariantList转换为QList<UnknownType>。
有什么建议吗?
编辑
我有一个抽象类Node,它包含
上下文* _context;QMap _inputsPersisted;QMap _outputsPersisted;
Node类还有一个virtual void runImplementation(),方法void run()如下所示:
(QMap::iterator it = _inputsPersisted.begin();it != _inputsPersisted.end();++it ){ QVariant属性=属性(it.key().toStdString().c_str());if(!attribute.isValid()) { qWarning() << QObject::tr("%1:%2:节点::run:%3:属性%4“){ QVariant v= _context->getDataPersisted(it.value());如果(!v.isValid() qWarning() << QObject::tr("%1:%2:节点:run:%3:%4不在“)中如果(v.type() != attribute.type()) qWarning() qWarning() << QObject::tr("%1:%2:节点:run:%3:%4和%5“)的话,则为其他其他if(!setProperty(it.key().toStdString().c_str(),v) qWarning() << QObject::tr("%1:%2:节点:run:%3:属性%4未为setted.").arg(__FILE__).arg(__LINE__).arg(_id.toString()).arg(it.key());“)} runImplementation();//set在上下文中输出(QMap::iterator it = _outputsPersisted.begin();it != _outputsPersisted.end();++it ){ QVariant属性= property(it.key().toStdString().c_str());if(!attribute.isValid()) { qWarning() << QObject::tr("%1:%2:节点::run:%3:属性%4“){ _context->setDataPersisted(it.value(),属性);} }
Context类如下所示:
类上下文: public QObject { Q_OBJECT public: Context( Context * Q_OBJECT= NULL)::_parent(父){}(QString名称,QVariant值){ if(_parent != NULL &_Q_OBJECT->exist(名称))_Q_OBJECT->setDataPersisted(名称、值);_stack.insert(名称、值);} QVariant getDataPersisted(QString名称){ QVariant v;QMap::iterator it = _stack.find( name);if(it != _stack.end()) v.setValue(it.value());否则if(_parent != NULL) v.setValue(_QVariant->getDataPersisted(Name));返回v;}私有: bool exist(QString名称){bool收纳=_stack.contains(名称);返回包含x\x ((_parent != NULL) && (_parent->exist( name);}私有: Context * _parent;QMap _stack;};
有了这个,Node子类可以在她的Context中放置和获取一些变量,这只能通过声明她的属性并初始化_inputsPersisted和_outputsPersisted。所有的逻辑都是由Node类完成的。
现在我想增加一个机制。我希望在Context中操作列表并执行append。为此,我修改了Context::setDataPersisted方法:
_stack.find(name)->value().canConvert(QVariant::List)) setDataPersisted(QString名称,QVariant值){ if(_parent != NULL &_QString->QVariant-)_QString->setDataPersisted(名称,值);ToChange.append(值);_stack.insert(名称,toChange );}_stack.insert(名称,值);}}
这样,在setDataPersited之后,另一个setDataPersisted (要“追加”)和一个getDataPersisted数据的列表就被破坏了。
发布于 2014-09-10 08:52:50
使用Q_DECLARE_METATYPE宏注册QVariantList与Qt元类型系统。这将允许将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) );https://stackoverflow.com/questions/25759776
复制相似问题