Q_DECLARE_METATYPE

Q_DECLARE_METATYPE связан с QVariant прямо таки тесно. 

Как только мы после объявлении класса в заголовочном файле указываем Q_DECLARE_METATYPE - мы сразу можем заворачивать этот класс в QVariant и когда надо разворачивать.

О чем речь? - Речь об универсальности данных.

То есть создавая например контейнер типа QHash<int,QVariant> мы можем в нем хранить разные по сути объекты.

Единственное условие это надо классу добавить Q_DECLARE_METATYPE и все.

Это очень мощная парадигма от Qt.