Нельзя передать умный указатель в QtConcurrent :: run, так как не существует соответствующей перегрузки.
Я бы предложил решение с использованием лямбда-выражений:
std::shared_ptr<Obj> obj_ptr(new Obj());
QtConcurrent::run([obj_ptr](){ obj_ptr->func(); });
Из-завнутренний счетчик ссылок в shared_ptr, вам не нужно беспокоиться о времени жизни объекта, принадлежащего интеллектуальному указателю, поскольку вы захватываете копию в лямбда-функции.
Другим решением будет передача необработанного указателя:
std::shared_ptr<Obj> obj_ptr(new Obj());
QtConcurrent::run(obj_ptr.get(), &Obj::func);
Но это довольно рискованно, поскольку вам нужно беспокоиться о времени жизни вашего объекта.
В конце я бы предпочел первый метод, поскольку он намного безопаснее.