如何在QAbstractListModel中将自定义对象定义为角色?

西莱克斯

我的问题是,如何在自定义对象中指定一个自定义对象,作为派生自该对象的角色,QAbstractListModel以便在可视化它时ListView可以访问其成员变量。这里有一个简单的代码示例:

这是我的类,代表我的自定义对象:

class MyCustomObject {
  public:
    MyCustomObject(Qstring name, Qstring type);
    QString getName();
    QString getType();

  private:
    QString name;
    QString type;
};

这是data()我的MyModel派生自QAbsractListModel的重写函数现在(但不起作用)的样子

QVariant MyModel::data(const QModelIndex &index, int role) const {
    if (index.row() < 0 || index.row() > m_atoms.count()) {
    //if (!index.isValid()) {
        return QVariant();
    }

    const MyData &data = m_data[index.row()];
    if(role == SomeRole) {
        return data.someString()
    }
    else if (role == MyCustomRole) {
        return data.myCustomObject; // How can I do this?
    }

    return QVariant();
}

在这里,我在中指定角色名称MyModel

QHash<int, QByteArray> AtomModel::roleNames() const {
    QHash<int, QByteArray> roles;
    roles[SomeRole] = "someRole";
    roles[MyCustomRole] = "myCustomRole";

    return roles;
}

这就是我ListView在QML代码中的样子,并举例说明了我如何访问MyCustomObject委托中的成员变量:

ListView {
        width: 400
        height: 400

        model: myModel
        delegate: Text {
            text: "Type: " + myCustomRole.getType() + ", Name: " + myCustomRole.getName() + ", some string: " someRole

        }
    }

EDIT1:=>修复所需的副本构造函数

在我的下方添加Q_DECLARE_METATYPE时,MyCustomObject出现以下错误:

call to implicitly-deleted copy constructor of `MyCustomObject`
in instantiation of member function 'QtMetaTypePrivate::QMetaTypeFunctionHelper<MyCustomObject, true>::Construct' requested here
in instantiation of function template specialization 'qRegisterNormalizedMetaType<MyCustomObject>' requested here QtMetaTypePrivate::QMetaTypeFunctionHelper<T>::Construct,
    return qRegisterNormalizedMetaType<T>(normalizedTypeName, dummy, defined);
in instantiation of function template specialization 'qRegisterMetaType<MyCustomObject>' requested here
Q_DECLARE_METATYPE(MyCustomObject)
expanded from macro 'Q_DECLARE_METATYPE'
#define Q_DECLARE_METATYPE(TYPE) Q_DECLARE_METATYPE_IMPL(TYPE)
expanded from macro 'Q_DECLARE_METATYPE_IMPL' 
      const int newId = qRegisterMetaType< TYPE >(#TYPE,
copy constructor of 'MyCustomObject' is implicitly deleted because base class 'QObject' has a deleted copy constructor
class MyCustomObject : public QObject
'QObject' has been explicitly marked deleted here Q_DISABLE_COPY(QObject)
expanded from macro 'Q_DISABLE_COPY'
       Class(const Class &) Q_DECL_EQ_DELETE;\

编辑2:

因此,我添加了@Evgeny建议的所有必需功能。我的代码现在可以正确编译,但是在运行时出现qml错误:TypeError: Property 'getType' of object QVariant(MyCustomObject) is not a function

我已经Q_INVOKABLEgetType()方法前面添加了内容,并且还MyCustomObject派生了public QObject我已经Q_DECLARE_METATYPEMyCustomObject头文件的底部添加MyCustomObject我调用的构造函数中qRegisterMetaType<MyCustomObject>("MyCustomObject"),在我main注册的类中也这样qmlRegisterType<MyCustomObject>("com.test.mycustomobject", 1, 0, "MyCustomObject")

这是MyCustomObject现在班级的样子:

class MyCustomObject : public QObject {
  public:
    MyCustomObject();
    MyCustomObject(Qstring name, Qstring type);
    MyCustomObject(const MyCustomObject& obj);
    ~MyCustomObject();
    Q_INVOKABLE QString getName();
    Q_INVOKABLE QString getType();

  private:
    QString name;
    QString type;
};
Q_DECLARE_METATYPE(MyCustomObject)

这就是data()我的MyModel派生自QAbsractListModel的重写函数的样子

QVariant MyModel::data(const QModelIndex &index, int role) const {
        if (index.row() < 0 || index.row() > m_atoms.count()) {
        //if (!index.isValid()) {
            return QVariant();
        }

        const MyData &data = m_data[index.row()];
        if(role == SomeRole) {
            return data.someString()
        }
        else if (role == MyCustomRole) {
            QVariant var; // this is the part, which has changed
            var.setValue(data.myCustomObject);
            return var;
        }

        return QVariant();
    }

我最初发布的所有其他功能都相同。

叶夫根尼

首先,您需要为Qt元类型系统声明自定义对象。您应该Q_DECLARE_METATYPE为此使用宏。另外,您可能需要使用qRegisterMetaType功能。然后,您应该注册您的对象以将其与QML一起使用。您应该使用qmlRegisterType函数。

还要确保您将其Q_INVOKABLE用于对象方法。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在目标c中将自定义对象存储为用户默认值?

来自分类Dev

如何在 Ksoap2 中将自定义 Array 对象设置为 soapObject.addProperty

来自分类Dev

如何在Rails中将自定义环境设置为默认环境?

来自分类Dev

如何在Power BI中将自定义类别设置为散点图?

来自分类Dev

如何在Flutter Android中将自定义视图设置为实际启动屏幕

来自分类Dev

如何在altair中将自定义颜色主题设置为默认值?

来自分类Dev

如何在Rails中将自定义环境设置为默认环境?

来自分类Dev

如何在情节提要中将自定义字体设置为UILabel

来自分类Dev

如何在对话框中将自定义颜色设置为getWindows

来自分类Dev

如何在MPAndroidChart PieChart中将自定义浮点值设置为y轴

来自分类Dev

如何在 Drupal 8 中将自定义类设置为子菜单?

来自分类Dev

如何在Python中将自定义类对象转换为元组?

来自分类Dev

如何在React中将自定义属性插入File对象

来自分类Dev

如何在iOS中将自定义类转换为自定义框架?

来自分类Dev

如何在Swift中归档和取消归档自定义对象?或者如何在Swift中将自定义对象保存到NSUserDefaults?

来自分类Dev

如何在Azure数据资源管理器中将自定义键/值对字符串解析为JSON对象?

来自分类Dev

如何在.R脚本中将自定义ggplot别名存储为`list`对象并沿所需的标签向量获取它们

来自分类Dev

将自定义属性定义为数据对象

来自分类Dev

如何在iOS应用程序中将自定义字体系列设置为系统字体

来自分类Dev

如何在C#中将自定义快捷键设置为ctrl +Ç(ç是土耳其字符)

来自分类Dev

在Scala中将自定义对象JSON编写为简单值(JSON读/写)

来自分类Dev

在OpenCv中将自定义模型设置为CvSVM

来自分类Dev

在WPF中将自定义对象绑定到TreeView

来自分类Dev

如何在Sitecore中将自定义配置文件分配给自定义域用户

来自分类Dev

如何在Windows Store App中将自定义类存储到LocalSettings?

来自分类Dev

如何在Meteor AutoForm中将自定义模板与架构匹配?

来自分类Dev

如何在JS Fiddle中将自定义属性添加到head标签?

来自分类Dev

如何在Odoo 8中将自定义纸张格式链接到pdf报告?

来自分类Dev

如何在Enterprise Architect中将自定义图标用于原型?

Related 相关文章

  1. 1

    如何在目标c中将自定义对象存储为用户默认值?

  2. 2

    如何在 Ksoap2 中将自定义 Array 对象设置为 soapObject.addProperty

  3. 3

    如何在Rails中将自定义环境设置为默认环境?

  4. 4

    如何在Power BI中将自定义类别设置为散点图?

  5. 5

    如何在Flutter Android中将自定义视图设置为实际启动屏幕

  6. 6

    如何在altair中将自定义颜色主题设置为默认值?

  7. 7

    如何在Rails中将自定义环境设置为默认环境?

  8. 8

    如何在情节提要中将自定义字体设置为UILabel

  9. 9

    如何在对话框中将自定义颜色设置为getWindows

  10. 10

    如何在MPAndroidChart PieChart中将自定义浮点值设置为y轴

  11. 11

    如何在 Drupal 8 中将自定义类设置为子菜单?

  12. 12

    如何在Python中将自定义类对象转换为元组?

  13. 13

    如何在React中将自定义属性插入File对象

  14. 14

    如何在iOS中将自定义类转换为自定义框架?

  15. 15

    如何在Swift中归档和取消归档自定义对象?或者如何在Swift中将自定义对象保存到NSUserDefaults?

  16. 16

    如何在Azure数据资源管理器中将自定义键/值对字符串解析为JSON对象?

  17. 17

    如何在.R脚本中将自定义ggplot别名存储为`list`对象并沿所需的标签向量获取它们

  18. 18

    将自定义属性定义为数据对象

  19. 19

    如何在iOS应用程序中将自定义字体系列设置为系统字体

  20. 20

    如何在C#中将自定义快捷键设置为ctrl +Ç(ç是土耳其字符)

  21. 21

    在Scala中将自定义对象JSON编写为简单值(JSON读/写)

  22. 22

    在OpenCv中将自定义模型设置为CvSVM

  23. 23

    在WPF中将自定义对象绑定到TreeView

  24. 24

    如何在Sitecore中将自定义配置文件分配给自定义域用户

  25. 25

    如何在Windows Store App中将自定义类存储到LocalSettings?

  26. 26

    如何在Meteor AutoForm中将自定义模板与架构匹配?

  27. 27

    如何在JS Fiddle中将自定义属性添加到head标签?

  28. 28

    如何在Odoo 8中将自定义纸张格式链接到pdf报告?

  29. 29

    如何在Enterprise Architect中将自定义图标用于原型?

热门标签

归档