Probably your problem is caused by noneffective code. Remember that timer event is processed only when event loop is reached, so your code must often return control to event loop. From time event to time event you can have small inaccuracies caused by this and they can accumulate to bigger differences.
If you need long term accuracy I wouldn't depend on QTimer only. Maybe you should try to use QTime::elapsed or QElapsedTimer to be able to compensate that differences.