First thing: QThread::exit is not virtual so overriding it will cause the base class member to be called when using a polymorphic type.
Advice: use your own stop function and call it instead of exit.
Second thing:
QMovie uses internally a QTimer.
QTimer posts events in the parent thread event loop. The problem, is that your thread ( unlike the main GUI thread ) does not have and event loop because you did not start one.
You can start the event loop with QThread::exec().
Third thing: in run() you call QMovie::start(). But QMovie::start will exit immediately and therefore run will finish and your thread will exit.

Yeah.
I suggest reading again in Assistant how QMovie has to be used.
It is an asynchronous objects, state based. This means that it will emit signals when it switches states, etc.
You have to synchronize with it by connecting to its signals. If you do this correctly I doubt you will need a thread to play it.
Could we see your initial code ( without the worker thread )?