首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >覆盖QObject::setProperty

覆盖QObject::setProperty
EN

Stack Overflow用户
提问于 2014-09-10 07:36:30
回答 1查看 1.4K关注 0票数 0

我想重写QObject::setProperty(const char*, QVariant),因为当我用包含QVariantListQVariant调用该方法时,该方法会失败,因为它不会将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数据的列表就被破坏了。

EN

回答 1

Stack Overflow用户

发布于 2014-09-10 08:52:50

使用Q_DECLARE_METATYPE宏注册QVariantList与Qt元类型系统。这将允许将QVariantList存储为QVariant

代码语言:javascript
复制
    Q_DECLARE_METATYPE(QVariantList);
...
    QVariantList var;
    QVariant v = QVariant::fromValue<QVariantList>( var );
    QVariantList lst = v.value<QVariantList>();

QList<SomeType>转换为QVariantList

代码语言:javascript
复制
QList<SomeType> lst1;
...
QVariantList    lst2;

for (const SomeType& st : lst1)
    lst2.append( QVariant::fromValue<SomeType>( st ) ); 

要将QVariantList转换为QList<SomeType>

代码语言:javascript
复制
QVariantList    lst2;
...
QList<SomeType> lst1;

for (const QVariant& st : lst2)
    lst2.append( st.value<SomeType>() ); 

编辑1:

代码语言:javascript
复制
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) );
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25759776

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档