Получает из QSettings и магазина QIcon

Я попытался сохранить QIcon, используя класс, который наследуется от QSettings следующим образом:

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"));

Вопрос — почему сейчас это работает? Как я могу сделать это лучше?

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 пример?

П.С .: Это было весело 🙂

5

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]