Некоторые возможности:
1) Используйте другой слот для вещей после сна:
QTimer::singleShot(3000, this, SLOT(anotherSlot());
...
void MyClass::anotherSlot() {
system(...);
}
2) Без другого слота, используя локальный цикл обработки событий:
//write file
QEventLoop loop;
QTimer::singleShot(3000, &loop, SLOT(quit()) );
loop.exec();
//do more stuff
Я бы избегал локального цикла событий и предпочел бы 1), хотя локальные циклы событий могут вызвать множество тонких ошибок (во время loop.exec () может случиться что угодно).