我尝试使用从QSettings派生的类存储QIcon,如下所示:



但我有一个错误:



而且它不起作用。出乎意料的是,如果我仅构造一个QSettings实例并保存69个type(QIcon)元素中的任何一个-它就可以正常工作。

QSettings set;
set.setValue("foo", QIcon());
setValue("fancy_icon", QIcon::fromTheme("document-new"));

问题是-为什么现在可以使用?我该如何做得更好?

最佳答案

对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函数中,您是否创建ojit_code实例?

附注:这很有趣:)

关于c++ - 从QSettings派生并存储QIcon,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16614150/

10-14 15:20