use QTimer::singleShot(0) to avoid task object destructed before slots are triggered