如何在QML中访问QPointer的成员?

问题描述 投票:0回答:1

我的项目使用 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。

qt qml qpointer
1个回答
0
投票

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);
    }
© www.soinside.com 2019 - 2024. All rights reserved.