可能标题看起来有点乱,直接上例子:
double d = 3.14;
QVariant v(d);
qDebug() << v.value<int>(); //3
QVariant
进行了演员表double
-> int
。
我想做同样的事情,但要有指针:
class Foo : public QObject{
Q_OBJECT;
};
Q_DECLARE_METATYPE(Foo*)
static const int __idFoo = qRgisterMetaType<Foo*>("Foo*");
//...
Foo *foo = new Foo();
QVariant v = QVariant::fromValue(foo);
qDebug() << v.value<QObject*>(); //QObject(0x0)
类型转换没有发生。
问题:有什么方法可以将指向派生类对象的指针放入QVariant
,并检索指向基类对象的指针?
UPD:代码与我的几乎相同:
class IRow : public QObject{
//...
};
class FirstRow : public IRow{
//...
};
class SecondRow : public IRow{
FirstRow *_first
Q_PROPERTY(FirstRow* first READ first WRITE setFirst)
public:
FirstRow* first() const{
return _first;
}
void first(FirstRow *first){
_first = first;
}
//...
};
在其他地方有一个函数对特定的接口实现一无所知IRow
。她必须读取表单中出现的对象的所有可用属性QVariant
(没有其他方法,可以使用模型),并将结果值转换为接口类型 ( IRow
)。这里没有显示。在 Qt5 中它应该,但在 Qt4 中不是。如果您使用@ixSci 解决方案,那么该类SecondRow
将如下所示:
class SecondRow : public IRow{
FirstRow *_first
Q_PROPERTY(FirstRow* first READ _first WRITE _setFirst)
public:
FirstRow* first() const{
return _first;
}
void first(FirstRow *first){
_first = first;
}
private:
IRow* _first() const{
return first();
}
void _setFirst(IRow *first){
_setFirst(qobject_cast<FirstRow*>(first));
}
//...
};
它有效,但是 setter 和 getter 的数量增加了一倍
使用您拥有的数据,显然,最简单(如果不是唯一)的选择就是这个
您可以为此编写包装函数,这将减少代码量。是这样的:
接着:
这段代码在 Qt5 上对我来说很好用
我的类.h
主.cpp
如果由于某种原因它返回 0。尝试向元系统注册转换器。为此,您可以使用此模板函数:
并在程序的最开始,添加函数:
对于您将存储在 QVariant 中的所有类型