考虑 QML 类型(在 QML 中定义,而不是在 C++ 中定义):
Foo {
}
假设我有一个 C++ 中的 QQuickItem* item
变量。 如何检查变量的类型是否为 Foo?
如果 Foo 是 C++ 类型,我可以这样做:
qobject_cast<Foo*>(item) == nullptr
由于 Foo 是一种 QML 类型,因此一个选项是
item->metaObject()->className().beginsWith("Foo")
(className()
返回类似 Foo_QMLTYPE_0
)
但这似乎不可靠且不可靠。
最佳答案
您可以使用魔术键属性:
Foo {
property bool isFoo : true
}
然后从 C++ 开始:
if (obj->property("isFoo").toBool())
如果对象不具有该属性,则条件应该失败。这也适用于“派生”对象,因为属性将被“继承”,例如,如果某个东西扩展了 Foo
但不一定命名为 FooSomething
而是 SomethingFoo
.
当然,会产生一些开销,在需要对许多实例进行大量类型检查的情况下,这种开销可能会很明显。我倾向于做的是在 C++ 级别上有效实现一个 quint32 类型属性,然后从 QML 中将其显式设置在需要类型信息的对象中。这样可以最大限度地减少开销,而且访问速度也比使用 property(name)
更快。
关于c++ - Qt:如何从 C++ 检查对象是否为 QML 类型 Foo,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41720757/