Пришёл к пониманию того, что моя дёрганная анимация (http://www.youtube.com/watch?v=KRk_LNd7EBg ) обусловлена тем, что я хочу странного от main event loop, на что он не рассчитан. Дело не в том, что в основном потоке у меня тяжёлый матан - матан вынесен в отдельные потоки, а основной поток только показывает готовые QPixmap в paintEvent(), что очень дёшево. Проблема в том, что основной цикл обработки событий объекта QApplication никому не обещал, что paintEvent() он умеет генерировать со стабильной частотой. Он имеет право иногда заниматься своими служебными вещами, блокироваться в ядре, страдать прочей фигнёй, даже если не нагружен вызовом никаких моих прочих слотов.
Что делать?
Создать отдельный поток, занимающийся только рисованием я не могу, т.к. QWidget::paintEvent() может быть вызвана только из основного цикла обработки событий QApplication (или нет?). Хотя можно создавать альтернативные циклы обработки событий в альтернативных потоках, но я не знаю, может ли быть из альтернативных ц.о.с. вызываться paintEvent... Мне кажется, paintEvent() должен вызваться из того ц.о.с., с которым ассоциирован синглтонный объект QApplication. Да или нет?
Неужели надо браться за OpenGL, если оставаться в рамках Qt? Рисовать не через OpenGL, а тем же способом, каким рисуются виджеты, но в обход Qt наверное тоже можно, но это будет совсем грязный хак.