c++ - 我应该使用 QVariant 还是 MyCustomType* 将对象从 Qml 传递到 C++?

标签 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 作为参数类型?它们有什么优点和缺点?

最佳答案

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

但是,您必须添加 Q_OBJECT 宏,目前您的代码中缺少该宏,因此这些类型将获得 MOC 处理,为它们生成必要的元数据,这正是 QtQuick 将要做的用于内省(introspection)。

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

关于c++ - 我应该使用 QVariant 还是 MyCustomType* 将对象从 Qml 传递到 C++?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45906807/

相关文章:

c++ - 查找 vs equal_range 和性能

qt - 如何以编程方式在 Treeview 中选择一行?

c++ - 如何删除 QTabWidget 的 "padding"?

performance - 在存在许多非重叠项目的情况下更新项目时出现 QML 性能问题

c++ - 如何对图像进行高质量缩放?

c++ - 为什么 C++ 不支持函数返回数组?

c++ - 如何在 QML 中编辑 QQmlListProperty

qt - 如何避免在 QML 初始化时创建属性绑定(bind)?

qt - DropShadow 用于半透明项目

c++ - opencv 将较小的图片放入较大的拷贝中无法正常工作