gpt4 book ai didi

c++ - 派生自 QSettings 并存储 QIcon

转载 作者:行者123 更新时间:2023-11-30 01:22:18 24 4
gpt4 key购买 nike

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

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

但是我有一个错误:

QVariant::save: unable to save type 69.

而且它不起作用。令人惊讶的是,如果我只是构建一个 QSettings 实例并保存 69 种类型(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 实例?

P.S:那很有趣 :)

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com