Естественно нужно следить, чтобы не удалился один раз из деструктора родителя, а второй раз отукда-то ещё. Точно так же, как следить за тем, чтобы не удалить простой указатель несколько раз. Случайностей не бывает, логика достаточно чёткая. У обьекта может быть один и только один родитель, который автоматически удалит его в собственном деструкторе. Если обьект удалится раньше по другой причине - он уберётся из списка дочерних обьектов и деструтор второй раз вызван не будет. Другими словами - можете спокойно удалять детей в деструкторе, более того иногда это необходимо, чтобы вызвать цепочку деструкторов в нужной последовательности, а не в случайном порядке, как это сделает ~QObject().
QPointer не удаляет обьекты. Этот класс нужен только для "хаков", программировать им не стоит - рискуете сломать процедурный стиль программирования, а, следовательно, запутать логику программы.
Не лучше ли было сделать нормальный QSmartPointer какой-нибудь и не городить огород с неявным удалением чайлдов?
Для этого нужно хранить экземпляры QSmartPointer в классе, что не всегда возможно. Хотя бы потому что обьекты могут "клеиться" к другим обьектам на лету.