- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有两个这样的类:
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*)
我的长凳是这样的:
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();
}
为什么 foo
为空?QVariant
允许多态性,因为我对 object
最佳答案
因为 Foo
不是从 QObject
派生的,而 QVariant
只支持 QObject
派生类型的多态性。
来自QVariant::value documentation :
If the QVariant contains a pointer to a type derived from QObject then T may be any QObject type. If the pointer stored in the QVariant can be qobject_cast to T, then that result is returned. Otherwise a null pointer is returned. Note that this only works for QObject subclasses which use the Q_OBJECT macro.
(强调我的)。这在后面引用的关于 QVariant::canConvert
的部分中被重复了,并且没有其他关于指针转换的内容。 QVariant
根本不支持您的场景。
好处是,如果您使 Foo
成为 QObject
的子类,您就不必再为 Q_DECLARE_METATYPE
烦恼了。
关于c++ - QVariant 的多态性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27857036/
我来自 Asp.Net 世界,试图理解 Angular State 的含义。 什么是 Angular 状态?它类似于Asp.Net中的ascx组件吗?是子页面吗?它类似于工作流程状态吗? 我听到很多人
我一直在寻找 3 态拨动开关,但运气不佳。 基本上我需要一个具有以下状态的开关: |开 |不适用 |关 | slider 默认从中间开始,一旦用户向左或向右滑动,就无法回到N/A(未回答)状态。 有人
我是一名优秀的程序员,十分优秀!