我的项目使用 Qt 和 QML。
我想绑定一个可以是一个类的多种类型的属性。
例如:
class base : public QObject
{
Q_OBJECT
public:
Q_PROPERTY(QVariant myVar read myVar NOTIFY myVarChanged)
QVariant myVar() {return var;}
signals:
void myVarChanged();
private:
QVariant var
}
class A : public QObject
{
Q_OBJECT
/*
similar with upper class
*/
QString myStr;
}
somewhere
{
QPointer<A> mine = new A;
base.myVar = QVariant::fromValue(mine)
}
现在我可以在 QML 中拥有 Base 了。
当我打电话时:
console.log(base.myVar)
控制台打印:
QVariant(QPoitner<A>(/*address*/)
但我无法更进一步。我想通过使用
myStr
来获得 base.myVar.myStr
,但它是未定义的。我该如何解决这个问题?
我无法使用
Q_GADGET
,因为 myStr
发生了变化。
有时我必须将B类或C类放入
myVar
,而不仅仅是A类,所以我必须使用QVariant。
有
QVariant::fromValue
和qvariant_cast
。如果您可能想先将其转换为 QObject*
,然后在出去时转换为 QVariant
,并且在返回时,您可以先将其转换为 QObject*
,然后使用 qobject_cast
来获得您的自定义类型。
YourObject* m_ptr;
Q_INVOKABLE QVariant getValue()
{
// Direct Method: convert C++ YourObject* pointer to QVariant for QML
return QVariant::fromValue<YourObject*>(m_ptr);
// QObject Method: convert C++ YourObject* to a QObject* then to QVariant
// return QVariant::fromValue<QObject*>(dynamic_cast<QObject*>(m_ptr));
}
Q_INVOKABLE bool compare(const QVariant& other)
{
// Direct Method: convert QVariant from QML to a C++ YourObject* ptr;
YourObject* _other = qvariant_cast<YourObject*>(other);
return comparePointers(m_ptr, _other);
// QObject Method: convert QVariant to QObject to YourQObject.
// QObject* _other = qvariant_cast<QObject*>(other);
// YourObject* __other = qobject_cast<YourObject*>(_other);
// return comparePointers(m_ptr, __other);
}