This is stripped-down version of a proof of concept designed by Thomas Lübking and me and well tested on Linux and Mac:
https://github.com/RJVB/qtwheeltest/blob/master/wheeltest.cpp
the timing parameters have been tuned in a rather ad-hoc fashion; the lower threshold is probably just fine as it is but the higher threshold could possibly be set lower. It represents the time one would have to hold down the Ctrl key before wheel events again cause zooming after the protection has triggered. Any wheel event without the modifier key set will also reset the timer.
This is a patch that merits being tested in practice, not just reviewed in source code.