从 QSettings 派生并存储 QIcon
Posted
技术标签:
【中文标题】从 QSettings 派生并存储 QIcon【英文标题】:Derives from QSettings and store QIcon 【发布时间】:2013-05-17 16:45:35 【问题描述】:我尝试使用派生自 QSettings 的类来存储 QIcon,如下所示:
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"));
问题是 - 为什么它现在有效?我怎样才能做得更好?
【问题讨论】:
您可以将图标转换为像素图并在其上调用 save() 以将其存储在磁盘上。问题是,你为什么要这样?该图标已经存储在系统中的某个位置,并且是它所属的位置。 【参考方案1】:对 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
实例?
P.S:这很有趣:)
【讨论】:
以上是关于从 QSettings 派生并存储 QIcon的主要内容,如果未能解决你的问题,请参考以下文章