thread signals replaced by QMetaObject::invokeMethod for cleaner API