为方便起见,让我们使用 type VariantMap,这样:
typedef QMap<QString, QVariant> VariantMap;
(这是序言)。所以:
- 我定义了一些自定义容器类型
ArgContainer 注册
Q_DECLARE_METATYPE:Q_DECLARE_METATYPE(ArgContainer)
注册
qRegisterMetaType我在课堂上定义和描述
ArgContainer:运算符 VariantMap();
因此:
//(далее в примере используется QVariant value с данными ArgContainer)
//1. Вот так работает правильно
{
ArgContainer ac = value.value<ArgContainer>();
VariantMap vm = (VariantMap)ac;
}
//2. А вот так возвращает пустой массив:
{
VariantMap vm = value.value<VariantMap>();
}
//(так дает синтаксическу ошибку VariantMap vm = (VariantMap)value)
最小的工作示例完全在一个文件中:
#include <QCoreApplication>
#include <QDebug>
typedef QMap<QString, QVariant> VariantMap;
class ArgContainer1
{
public:
operator VariantMap() {
return QMap<QString, QVariant>({{"test","hey"}});
}
};
Q_DECLARE_METATYPE(ArgContainer1)
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
ArgContainer1 ac0;
QVariant value = QVariant::fromValue<ArgContainer1>(ac0);
//1. Вот так работает правильно
{
ArgContainer1 ac = value.value<ArgContainer1>();
VariantMap vm = (VariantMap)ac;
qDebug() << "1 value:" << vm.value("test");
}
//2. А вот так возвращает пустой массив:
{
VariantMap vm = value.value<VariantMap>();
qDebug() << "2 value:" << vm.value("test");
}
return a.exec();
}
控制台执行结果:
1 value: QVariant(QString, "hey") 2 value: QVariant(Invalid)
问题是如何处理ArgContainer使选项 (2) 起作用的类型?
也就是说,QVariant::value() 函数可以正常工作ArgContainer
解决问题,一改一注册。
更改:您需要使转换运算符保持不变(它应该立即完成,因为根据头脑它应该是这样的)。
注册:我们需要告诉 Qt 元系统我们有类型之间的转换(例如在 main 中的某个地方)。