我应该使用 QVariant 还是 MyCustomType* 将对象从 Qml 传递到 C++?
Should I use QVariant or MyCustomType* to pass an object from Qml to C++?
我有 C++ class 用户
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 登录表单,单击时会调用此代码:
var user = userComponent.createObject()
user.login = loginTextField.text
user.password = passwordTextField.text
signInInteractor.signIn(user)
SignInInteractor 是一个 C++ class
class SignInInteractor : public QObject
{
Q_INVOKABLE void signIn(User* user);
Q_INVOKABLE void signIn(QVariant user);
...
}
我的问题是我应该使用 User*
还是 QVariant
作为参数类型?他们有什么优点和缺点?
您的自定义类型是 QObject
派生的,因此您可以在 QML 的 QObject *
级别上轻松处理它。您将能够直接访问属性、槽或可调用对象以及函数,而无需执行任何额外操作。
然而,您必须添加 Q_OBJECT
宏,目前您的代码中缺少该宏,因此这些类型将获得 MOC 处理,为它们生成必要的元数据,这就是 QtQuick 的作用用于内省。
如果您将它作为变体传递,它将像一个不透明的指针,除了传递它之外,您将无法从 QML 中使用它做很多事情。只有当 QML 不支持该类型时才有意义,并且 QObject
更像是那里的第一个 class 公民。
我有 C++ class 用户
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 登录表单,单击时会调用此代码:
var user = userComponent.createObject()
user.login = loginTextField.text
user.password = passwordTextField.text
signInInteractor.signIn(user)
SignInInteractor 是一个 C++ class
class SignInInteractor : public QObject
{
Q_INVOKABLE void signIn(User* user);
Q_INVOKABLE void signIn(QVariant user);
...
}
我的问题是我应该使用 User*
还是 QVariant
作为参数类型?他们有什么优点和缺点?
您的自定义类型是 QObject
派生的,因此您可以在 QML 的 QObject *
级别上轻松处理它。您将能够直接访问属性、槽或可调用对象以及函数,而无需执行任何额外操作。
然而,您必须添加 Q_OBJECT
宏,目前您的代码中缺少该宏,因此这些类型将获得 MOC 处理,为它们生成必要的元数据,这就是 QtQuick 的作用用于内省。
如果您将它作为变体传递,它将像一个不透明的指针,除了传递它之外,您将无法从 QML 中使用它做很多事情。只有当 QML 不支持该类型时才有意义,并且 QObject
更像是那里的第一个 class 公民。