1

我尝试使用派生自 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"));

问题是 - 为什么现在它起作用了?我怎样才能做得更好?

4

1 回答 1

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::constructQApplication::QApplication(int &argc, char **argv)

所以我不得不问,在你的main函数中,你创建QApplication实例吗?

PS:那很有趣:)

于 2013-05-17T17:25:16.380 回答