I think using load() just converts one problem to another one as you'd have to store binary (written by QDataStream) representations of your types instead of the nice xml ones. In my opinion you either need a "gigantic switch" to save and load a given meta type id from/to a given XML node or you can use inheritance to expose an interface for reading and writing such nodes and implement that interface for any meta type id you want to handle (which is basically what QMetaType::load() uses as well).