gpt4 book ai didi

c++ - 将私有(private)子类添加到 Q_DECLARE_METATYPE

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:02:34 25 4
gpt4 key购买 nike

如何将 MySubClass 添加到 Q_DECLARE_METATYPE。

这是示例代码,请忽略代码业务。

#include <QMetaType>
#include <QVariant>
#include <QDebug>

namespace MyNS {
class MyClass : public QObject {
public:
MyClass() : value(0) { }
MyClass(int value) : value(value) { }
MyClass(const MyClass &other) { value = other.value; }
~MyClass() { }
int getValue() const {
MySubClass msc(value);
QVariant v = QVariant::fromValue(msc);
int tempV = v.value<MySubClass>().getSubValue();
return tempV;
}
private:
class MySubClass
{
public:
MySubClass() : subValue(0) {}
MySubClass(int v) : subValue(v)
{

}
int getSubValue()
{
return subValue;
}
private:
int subValue;
};
// Q_DECLARE_METATYPE(MySubClass); error : 'QMetaTypeId<MyNS::MyClass::MySubClass>': cannot specialize template in current scope
int value;
};

// Q_DECLARE_METATYPE(MySubClass); error : 'MySubClass': undeclared identifier
}

Q_DECLARE_METATYPE(MyNS::MyClass);

int main(int argc, char *argv[])
{
MyNS::MyClass m(15);
QVariant v = QVariant::fromValue(m);
qDebug() << v.canConvert<MyNS::MyClass>();
qDebug() << v.value<MyNS::MyClass>().getValue();
}

考虑 MyClass 在没有子类的情况下工作得很好,但我的问题是子类。我想在我的代码中将 MySubClass 与 QVariant 一起使用,但 MySubClass 是私有(private)的。

最佳答案

要将 QMetaType 用于您的 MySubClass,它需要可公开访问。

想想为什么要将MySubClass插入到Qt的元类型系统中?

如果您希望能够通过信号/槽发送MySubClass,或者(反)序列化/流式传输它,这将使MySubClass 符合公共(public)利益。 The docs tell you so :

Before we begin, we need to ensure that the custom type we are creating meets all the requirements imposed by QMetaType. In other words, it must provide:

a public default constructor,
a public copy constructor, and
a public destructor.

如果您只想在QVariant中存储MySubClass实例,您可以编写自己的转换方法

QVariant toVariant() const

(static) MySubClass fromVariant(QVariant const &v)

为了类型安全,您可以创建一些公共(public)虚拟类型并使用 QMetaType 注册它,这样您将获得一个唯一的 ID,但基本上您会转换您的 MySubClassQVariantMap 并返回,前提是所有包含的数据都可存储在 QVariant 中。

关于c++ - 将私有(private)子类添加到 Q_DECLARE_METATYPE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56923689/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com