вот еще раз пришлось столкнуться с этим же... забыл как боролся и в поиске увидел свой пост, нашел свою ошибку и решил поправить =)
После внимательного прочтения ( целого абзаца! =) ) документации оказалось, что никто и не обещал восстановления геометрии главного окна при вызове метода restoreState().
В общем не важно где происходит сохранение в деструкторе или в closeEvent(), как, думаю, не важно и с восстановлением... Важно сохранять и восстанавливать (если это, конечно, требуется) и геометрию и состояние отдельно!
Вот так все работает:
ActionTest::ActionTest(QWidget *parent, Qt::WFlags flags)
    : QMainWindow(parent, flags)
{
    QSettings s;
    restoreGeometry( s.value( APP_GEOMETRY, QByteArray() ).toByteArray() ); 
    restoreState( s.value( APP_STATE, QByteArray() ).toByteArray() );
}
ActionTest::~ActionTest()
{
    QSettings s;
    
    s.setValue( APP_STATE, saveState() );
    s.setValue( APP_GEOMETRY, saveGeometry() );
}