【问题标题】:Understanding Exposing Attributes of C++ Types to QML了解向 QML 公开 C++ 类型的属性
【发布时间】:2017-01-10 22:39:46
【问题描述】:

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

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

我有几个疑问

  1. 我无法访问我的函数 loadItemList()findcubby(),但是一旦我包含了 Q_OBJECT 宏,它就开始工作了,为什么?
  2. 我在网上的一些代码中看到他们经常使用explicit Itemlist(QObject *parent = 0);之类的东西,这是为什么?这是什么意思?
  3. 我已将我的 Hash 映射定义为公共变量,我知道这不好,有人可以告诉我如何处理私有哈希映射。

这是我的头文件

#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;
    }

}

【问题讨论】:

  • 这些都是基本问题。如果您不想在 Qt 文档中查看 Q_OBJECT 的用途,Google 中关于它的前 2 个结果是 SO 问题,分别名为“Q_OBJECT 宏做什么?为什么所有 Qt 对象都需要这个宏?”和“什么时候应该使用 Q_OBJECT?”。如果您搜索“显式 c++”,情况也是如此。只需将您的哈希设置为您班级的私有成员,您的代码仍然可以在这里工作。

标签: c++ qt hashmap qml


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

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

例如

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: 一样

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多