Q_DECLARE_METATYPE связан с QVariant прямо таки тесно.
Как только мы после объявлении класса в заголовочном файле указываем Q_DECLARE_METATYPE - мы сразу можем заворачивать этот класс в QVariant и когда надо разворачивать.
О чем речь? - Речь об универсальности данных.
То есть создавая например контейнер типа QHash<int,QVariant> мы можем в нем хранить разные по сути объекты.
Единственное условие это надо классу добавить Q_DECLARE_METATYPE и все.
Это очень мощная парадигма от Qt.