Le comportement que vous indiquez est prévisible, vous devez d'abord savoir que si un widget devient visible, vos enfants le seront aussi.
Analysons le cas de QTabWidget, ce widget est essentiellement une QTabBar + QStackedWidget, le QStackedWidget gère la visibilité des widgets, et ce dernier possède en interne un QStackedLayout qui, lorsqu'il établit qu'un certain widget doit être affiché, cache le widget actuel et affiche le nouveau widget actuel. Ainsi, chaque fois que vous sélectionnez la barre de tabulation, le widget qui est affiché appellera la méthode show de ce widget (dans votre cas, QTableWidget), et il rendra vos enfants visibles même s'ils sont cachés.
Donc si vous voulez que si vous avez le besoin que cela fonctionne comme vous le supposez une solution de contournement devrait se produire il est de sauvegarder le statut de la visibilité dans une propriété et dans la méthode showEvent pour appliquer le changement si nécessaire.