从QSettings派生并存储QIcon

时间:2013-05-17 16:45:36

标签: c++ qt qvariant qsettings qicon

我尝试使用类来存储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"));

问题是 - 为什么现在有效?我怎样才能做得更好?

1 个答案:

答案 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:很有趣:)