我应该使用QVariant或MyCustomType *将对象从Qml传递给C ++吗?

时间:2017-08-27 15:59:06

标签: c++ qt qml qtquick2 qt-quick

我有C ++类用户

class User : public QObject
{
    Q_PROPERTY(QString login READ login WRITE setLogin NOTIFY loginChanged)
    Q_PROPERTY(QString password READ password WRITE setPassword NOTIFY passwordChanged)
    ...
}

此外,我还有带按钮的Qml SignIn表单,单击时调用此代码:

var user = userComponent.createObject()
user.login = loginTextField.text
user.password = passwordTextField.text
signInInteractor.signIn(user)

SignInInteractor是一个C ++类

class SignInInteractor : public QObject
{
    Q_INVOKABLE void signIn(User* user);
    Q_INVOKABLE void signIn(QVariant user);
    ...
}

我的问题是我应该使用User*还是QVariant作为参数类型?他们有什么优点和缺点?

1 个答案:

答案 0 :(得分:3)

您的自定义类型是QObject派生的,因此您可以在QML的QObject *级别轻松处理它。您将能够直接访问属性,插槽或invokables和函数,而无需执行任何额外操作。

但是,您必须添加代码中当前缺少的Q_OBJECT宏,以便类型获得MOC处理,这将为它们生成必要的元数据,这就是QtQuick将用于内省。

如果你将它作为一个变体传递,它就像一个不透明的指针,除了传递它之外你不能用QML做很多事情。只有在QML不支持该类型时才有意义,而QObject更像是那里的一等公民。