Russian Qt Forum

Qt => Общие вопросы => Тема начата: Crazy Sage от Июнь 24, 2017, 13:31



Название: Отправка через QueuedConnection вектора умных указателей
Отправлено: Crazy Sage от Июнь 24, 2017, 13:31
Приветствую, столкнулся с такой задачей - надо между потоками сигнал-слотом прокинуть QVector<QSharedPointer<Tester> >
Tester - мой класс, унаследованный от QObject'а.
При попытке сделать в лоб ругается, что надо регистрировать метатип.

Если пытаюсь после объявления класса Tester добавить
Код:
typedef QVector<QSharedPointer<Tester> > TestPointerVector;
Q_DECLARE_METATYPE(TestPointerVector);

А в main() сделать
Код:
qRegisterMetaType<TestPointerVector>();
То не собирается, выдаёт ошибки из qmetatype.h и qtypeinfo.h о том, что к этому франкенштейну и sizeof не применить, и тип его неполный.

Как вообще это сделать правильно?
Тестовый main() выглядит следующим образом
Код:
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    qRegisterMetaType<TestPointerVector>();
    Receiver* rcv = new Receiver(0);
    Emitter* emt = new Emitter(0);
    QThread* thread = new QThread();
    QObject::connect(rcv, SIGNAL(finished()), thread, SLOT(quit()));
    QObject::connect(rcv, SIGNAL(finished()), rcv, SLOT(deleteLater()));
    QObject::connect(emt, SIGNAL(send(TestPointerVector)), rcv, SLOT(receive(TestPointerVector)), Qt::QueuedConnection);
    rcv->moveToThread(thread);
    thread->start();
    emt->process();

    while(!thread->isFinished())
        continue;
    return a.exec();
}


Название: Re: Отправка через QueuedConnection вектора умных указателей
Отправлено: sergek от Июнь 24, 2017, 16:52
Вроде, нужно так:
qRegisterMetaType<TestPointerVector>("TestPointerVector");


Название: Re: Отправка через QueuedConnection вектора умных указателей
Отправлено: Crazy Sage от Июнь 24, 2017, 17:07
Вроде, нужно так:
qRegisterMetaType<TestPointerVector>("TestPointerVector");

Так я тоже пробовал, разницы никакой, ошибки компиляции остаются те же.


Название: Re: Отправка через QueuedConnection вектора умных указателей
Отправлено: Kurles от Июнь 24, 2017, 21:32
То не собирается, выдаёт ошибки из qmetatype.h и qtypeinfo.h о том, что к этому франкенштейну и sizeof не применить, и тип его неполный.
Такое может быть из-за того, что тайпдеф до объявления Tester делается.


Название: Re: Отправка через QueuedConnection вектора умных указателей
Отправлено: Crazy Sage от Июнь 24, 2017, 21:35
Разобрался, оказывается в такой ситуации нельзя отправлять в сигнале слоте QVector<>, надо const QVector<>&, тогда всё работает.