我尝试使用类来存储QIcon,该类派生自QSettings,如下所示:
setValue(“fancy_icon”,QIcon :: fromTheme(“document-new”));
但我有一个错误:
QVariant :: save:无法保存69型。
它不起作用。令人惊讶的是,如果我只是构造一个QSettings实例并保存任何69类型(QIcon)元素 - 它工作正常。
QSettings set;
set.setValue("foo", QIcon());
setValue("fancy_icon", QIcon::fromTheme("document-new"));
问题是 - 为什么现在有效?我怎样才能做得更好?
答案 0 :(得分:5)
通过Qt的消息来挖掘。
qvariant.cpp
unable to save type
唯一出现if (!QMetaType::save(s, d.type, constData())) {
Q_ASSERT_X(false, "QVariant::save", "Invalid type to save");
qWarning("QVariant::save: unable to save type %d.", d.type);
}
错误调用的地方:
QMetaType::save
所以我去了bool QMetaType::save(QDataStream &stream, int type, const void *data)
{
...
case QMetaType::QPalette:
case QMetaType::QIcon:
case QMetaType::QImage:
...
if (!qMetaTypeGuiHelper)
return false;
qMetaTypeGuiHelper[type - FirstGuiType].saveOp(stream, data);
break;
...
return true;
}
:
qMetaTypeGuiHelper
Q_CORE_EXPORT const QMetaTypeGuiHelper *qMetaTypeGuiHelper = 0;
声明如下:
qMetaTypeGuiHelper
显然,在你的情况下,QtGui
等于零。所以我决定找到它创建的地方。并在static const QVariant::Handler *qt_guivariant_last_handler = 0;
int qRegisterGuiVariant()
{
qt_guivariant_last_handler = QVariant::handler;
QVariant::handler = &qt_gui_variant_handler;
qMetaTypeGuiHelper = qVariantGuiHelper;
return 1;
}
Q_CONSTRUCTOR_FUNCTION(qRegisterGuiVariant)
int qUnregisterGuiVariant()
{
QVariant::handler = qt_guivariant_last_handler;
qMetaTypeGuiHelper = 0;
return 1;
}
Q_DESTRUCTOR_FUNCTION(qUnregisterGuiVariant)
模块中找到:
QIcon
这意味着,为了将QVariant
保存到qRegisterGuiVariant();
,您只需拨打QApplicationPrivate::initialize()
即可。但是这个函数已经在QApplicationPrivate::construct
中调用,从QApplication::QApplication(int &argc, char **argv)
调用,main
QApplication
所以我要问你在{{1}}函数中创建{{1}}实例吗?
P.S:很有趣:)