Насколько я понимаю, просто невозможно вызвать moveToThread
для объекта, живущего в другом потоке. Даже если аргумент nullptr
, вы получите сообщения от Qt:
QObject::moveToThread: Current thread ( ... ) is not the object's thread ( ... )
Cannot move to target thread (0x0)
, и объект не будет перемещен из своего потока.
Безопасный способ перетянуть объект в другой поток - это использовать подключение в очереди, то есть предоставление подвижному объекту слота, например
class Moveable : public QObject
{
Q_OBJECT
public:
Moveable() : QObject(nullptr) {}
public slots:
void moveMe(QThread * destination) { moveToThread(destination); }
Таким образом, можно использовать сигнал в объекте mover , например
class Mover : public QObject
{
Q_OBJECT
signals:
void moveIt(QThread *);
, соедините их
connect(&mover, &Mover::moveIt, &moveable, &Moveable::moveMe, Qt::QueuedConnection);
и, где необходимо
mover.moveIt(QThread::currentThread());
или
mover.moveIt(to_whatever_thread);
Если кто-то просто не хочет иметь дело с реализацией сигналов и их соединением, можно смело использовать что-то вроде:
QMetaObject::invokeMethod(&moveable, "moveMe", Qt::QueuedConnection, Q_ARG(QThread*, destination_thread));
, снова используя соединение в очереди, но непосредственно вызывая слот.
О дополнительном вопросе . Как только объект перемещен в поток 0x0
, как указано здесь :
, обработка событий для этого объекта или его дочерних элементов не может произойти, так как они больше не связаны с какими-либо thread.
Таким образом, объект также прекратит получать сигналы, даже от другого объекта, который также был перемещен в 0x0
.