I know that I could 'manually' show/hide the dock widgets (after/before saving/restoring my application's state), but this would 'break' my GUI logic since I have some menu items which I use to show/hide those dock widgets.
The better way is to change you GUI Menu logic to update the hide/show actions based on the currernt QDockWidget visibility.

Also, this wouldn't address the question of how this 'showing'/'hiding' would be triggered which I want to be done through a button within the docking area.
That should is simple, just add a button and connect to hide() slot.

So... I was thinking of customising QMainWindow's docking feature so that it could do what I am after. However, with Qt implementating QMainWidnow's docking feature in private classes means that I cannot customise anything. I am therefore thinking of 'cloning' QMainWindow (and whatever would need 'cloning'), renaming the clone to, say, TMainWindow, customising TMainWindow to my specific needs, and then have my main form inherit from TMainWindow rather than QMainWindow.
Not sure what you intend to change in QMainWindow to fit your requirement, whatever it be, I see this as an over-kill and defenetly will not worth to do.