gpt4 book ai didi

qt - 如何验证 QVariant::UserType 类型的 QVariant 是预期类型?

转载 作者:行者123 更新时间:2023-12-04 05:59:13 26 4
gpt4 key购买 nike

我正在编写测试代码,该代码将自动遍历所有 Q_PROPERTY 小部件,并且某些属性使用通过 qRegisterMetaType 注册的类型。如果我想将这些读/写到 QVariant 中,我需要在将它们存储到变体中时使用 QVariant::UserType。到现在为止还挺好。

但是当我想测试这些属性的读写时,我还需要知道它们的类型。对于已经是标准 qt 类型的东西,我可以通过 QVariant::type() 来做到这一点,但由于我有很多用户类型,这将如何实现?

从 QVariant 的 api 中,我发现了这一点:
bool QVariant::canConvert ( Type t ) const
但是我有点怀疑这是否会在枚举的情况下导致错误的类型?

那么,验证 QVariant 中存储的用户类型类型的万无一失的方法是什么?

最佳答案

对于用户定义的类型,有 QVariant::userType() .它的工作原理类似于 QVariant::type(),但返回用户定义类型的类型 id 整数,而 QVariant::type() 始终返回 QVariant::UserType。

还有QVariant::typeName()它以字符串形式返回类型的名称。

编辑 :

这可能取决于您如何设置 QVariant。直接使用QVariant::QVariant(int type, const void * copy)气馁。

说我有这样的三种类型:

class MyFirstType
{
public:
MyFirstType();
MyFirstType(const MyFirstType &other);
~MyFirstType();

MyFirstType(const QString &content);

QString content() const;

private:
QString m_content;
};
Q_DECLARE_METATYPE(MyFirstType);

第三个没有 Q_DECLARE_METATYPE

我将它们存储在 QVariant 中:
 QString content = "Test";

MyFirstType first(content);

MySecondType second(content);

MyThirdType third(content);

QVariant firstVariant;
firstVariant.setValue(first);

QVariant secondVariant = QVariant::fromValue(second);

int myType = qRegisterMetaType<MyThirdType>("MyThirdType");

QVariant thirdVariant(myType, &third); // Here the type isn't checked against the data passed

qDebug() << "typeName for first :" << firstVariant.typeName();
qDebug() << "UserType :" << firstVariant.userType();
qDebug() << "Type : " << firstVariant.type();

[...]

我得到:
typeName for first : MyFirstType 
UserType : 256
Type : QVariant::UserType

typeName for second : MySecondType
UserType : 257
Type : QVariant::UserType

typeName for third : MyThirdType
UserType : 258
Type : QVariant::UserType

关于qt - 如何验证 QVariant::UserType 类型的 QVariant 是预期类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3193275/

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