从 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的主要内容,如果未能解决你的问题,请参考以下文章

为啥 QSettings 不存储任何内容?

如何使用 QSettings 存储 Python 字典

Qsettings 只能存储一次价值?

QSettings 类

如何使用 QSettings 将 QString 添加到注册表

不同类型的 QSettings