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
インスタンスを作成しますか?
PS: 楽しかったです :)