理解将C ++类型的属性暴露给QML

时间:2017-01-10 22:39:47

标签: c++ qt hashmap qml

我想编写一个非常简单的代码来查找字符串,然后输出分配给它的变量。 我想更多地了解C ++和QML之间的通信。所以我想在C ++中使用哈希映射,然后在QML中使用这些函数来列出结果。

我有很多错误,所以我基本上尝试了一切使它工作,现在我的代码工作。但有人可以帮助我理解我所做的事情。

我很怀疑

  1. 我无法访问我的函数loadItemList()findcubby()但是只要我加入Q_OBJECT宏,它就开始工作了吗?
  2. 我在网上的一些代码中看到他们经常使用类似explicit Itemlist(QObject *parent = 0);的原因,这是什么意思?这是什么意思?
  3. 我已将Hash地图定义为公共变量,我知道这种变量并不好,有人可以告诉我如何使用私有哈希映射。
  4. 这是我的头文件

    #ifndef ITEMLIST_H
    #define ITEMLIST_H
    #include <QObject>
    #include <QHash>
    class Itemlist : public QObject
     {
       Q_OBJECT
    public:
        Itemlist();
        Q_INVOKABLE int find_cubby(QString);
        QHash<QString, int> my_itemlist;
    };
    

    这是cpp文件

    #include "itemlist.h"
    Itemlist::Itemlist()
    {
        my_itemlist["aaaa"]=1;
        my_itemlist["bb"]=1;
        my_itemlist["cc"]=1;
        my_itemlist["dd"]=1;
        my_itemlist["ee"]=2;
        my_itemlist["ff"]=2;
        my_itemlist["gg"]=3;
        my_itemlist["hh"]=3;
        my_itemlist["ii"]=3;
    
    }
    
    int Itemlist::find_cubby(QString Name)
    {
        if(my_itemlist.contains(Name))
        {
            return my_itemlist.value(Name);
        }
        else
        {
            return 4;
        }
    
    }
    

1 个答案:

答案 0 :(得分:1)

  1. Q_OBJECT是必要的,因为它用作moc代码生成器的标记,以便为类创建运行时内省数据。属性或Q_INVOKABLE等功能取决于该机制。

  2. explicit是一个C ++关键字,它将构造函数标记为不可用于隐式类型转换。通常,编译器可以使用可以使用单个参数调用的构造函数在参数类型和该构造函数的类之间进行转换。

  3. E.g。

    class Foo
    {
    public:
        Foo(int i) {}
    };
    
    void doSomething(Foo f) {}
    
    doSomething(5);
    

    编译器有一个整数5,需要一个Foo对象。 Foo有一个构造函数,它接受一个int,因此它可以用它来进行自动类型转换。 explicit Foo(int i) {}删除了该选项,因此编译器将退出并显示错误,并说它无法找到doSomething(int)函数。

    1. 使用您班级中的private:部分,就像您目前使用public:
    2. 一样