art*_*oon 4 c++ qt qvariant qmetatype
我有两个这样的课程:
Run Code Online (Sandbox Code Playgroud)class Foo { public: Foo(int i) : _i(i) {} int _i; }; Q_DECLARE_METATYPE(Foo*)
class Bar : public Foo
{
public:
Bar(int i, int j) : Foo(i), _j(j) {}
int _j;
};
Q_DECLARE_METATYPE(Bar*)
Run Code Online (Sandbox Code Playgroud)
我的板凳是这样的:
Run Code Online (Sandbox Code Playgroud)int main(int argc, char *argv[]) { QApplication a(argc, argv); Bar* bar = new Bar(10,11); QVariant var = QVariant::fromValue(bar); Foo * foo = var.value<Foo*>(); // foo IS NULL QPushButton * b = new QPushButton(); QVariant v = QVariant::fromValue(b); QObject * object = v.value<QObject*>(); // object IS NOT NULL return a.exec(); }
为什么是foonull?
QVariant让我的多态性,因为我没有问题object
因为Foo不是派生自QObject且QVariant只支持QObject-derived类型的多态性.
如果QVariant包含指向从QObject派生的类型的指针,则T可以是任何QObject类型.如果存储在QVariant中的指针可以是qobject_cast到T,则返回该结果.否则返回空指针.请注意,这仅适用于使用Q_OBJECT宏的QObject子类.
(强调我的).这部分QVariant::canConvert是关于进一步向下引用的部分重新进行的,并且没有关于指针转换的其他内容.QVariant根本不支持您的方案.
好处是如果你做Foo了一个子类QObject,你就不必再费心Q_DECLARE_METATYPE了.
| 归档时间: |
|
| 查看次数: |
847 次 |
| 最近记录: |