1

次のように QSettings から派生したクラスを使用して QIcon を保存しようとしました。

setValue("fancy_icon", QIcon::fromTheme("document-new"));

しかし、私はエラーがあります:

QVariant::save: タイプ 69 を保存できません。

そして、それは機能しません。驚いたことに、QSettings インスタンスを構築して 69 の type(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 に答える