Как вызвать слот для объекта в другом потоке без использования подключения?

Рассмотрим QObject:

class TestObject: public QObject
{
        Q_OBJECT
    public slots:
        void doStuff();
};

Мы запустим этот объект в другом потоке:

TestObject* o = new TestObject;
o->moveToThread(someThreadPointer);

Теперь, как мне вызвать doStuff, чтобы это произошло в рабочем потоке? Если у меня есть другой объект в основном потоке, я могу сделать это:

class OtherObject: public QObject
{
        Q_OBJECT
    signals:
        signalToDoStuff();
};

Тогда в основном потоке:

TestObject* o = new TestObject;
o->moveToThread(someThreadPointer);
OtherObject other* = new OtherObject;
QObject::connect(other, &OtherObject::signalToDoStuff, o, &TestObject::doStuff);
// Emit the signal which causes `doStuff` to be called in other thread
other->signalToDoStuff();

Но это долгий путь. Мне нужно поставить в очередь событие для вызова doStuff.


person Tomáš Zato - Reinstate Monica    schedule 02.08.2016    source источник
comment
Вопрос, дубликатом которого он является, является более общим: он спрашивает не только, как вызвать слот, но в более общем плане, как вызвать любой функтор.   -  person Kuba hasn't forgotten Monica    schedule 03.08.2016
comment
Я думаю, ты хочешь QMetaObject::invokeMethod(testObject, "doStuff", Qt::QueuedConnection);.   -  person Jarod42    schedule 03.08.2016
comment
@KubaOber С вашим отношением к закрывающим вопросам любой вопрос может быть закрыт на основании того факта, что решение может быть (возможно) получено из какого-то другого вопроса по SO. Это не так. Я спрашиваю конкретно о слотах, поэтому, если другой пост не посвящен конкретно слотам или решение, касающееся слотов, точно не совпадает, снова откройте этот вопрос.   -  person Tomáš Zato - Reinstate Monica    schedule 03.08.2016
comment
Любой ответ, который будет работать с функторами, будет работать и со слотами. Это действительно дубликат: все ответы на дублирующий вопрос являются ответами на ваш вопрос. Здесь нет никакого вывода: вы буквально заменяете функтор связанным слотом (через std::bind или лямбду) и все. Вы также немного ошибочно сформулировали это: вас не волнуют connect, вы заботитесь о том, чтобы не было лишних сигналов. Например. Мой ответ на другой вопрос касается того, как можно избежать использования специального класса для излучения сигнала, используя QObject::destroyed на временном объекте.   -  person Kuba hasn't forgotten Monica    schedule 03.08.2016
comment
Единственный способ не создать дубликата, если вам нужны решения, работающие в Qt 4, поскольку, очевидно, вы не можете QMetaObject::invoke там функтор.   -  person Kuba hasn't forgotten Monica    schedule 03.08.2016