Russian Qt Forum
Ноябрь 23, 2024, 19:43 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Отправка через QueuedConnection вектора умных указателей  (Прочитано 6530 раз)
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();
}
Записан
sergek
Гипер активный житель
*****
Offline Offline

Сообщений: 872


Мы должны приносить пользу людям.


Просмотр профиля
« Ответ #1 : Июнь 24, 2017, 16:52 »

Вроде, нужно так:
qRegisterMetaType<TestPointerVector>("TestPointerVector");
« Последнее редактирование: Июнь 24, 2017, 17:01 от sergek » Записан

Qt 5.13.0 Qt Creator 5.0.1
Win10, Ubuntu 20.04
Crazy Sage
Гость
« Ответ #2 : Июнь 24, 2017, 17:07 »

Вроде, нужно так:
qRegisterMetaType<TestPointerVector>("TestPointerVector");

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

Сообщений: 480



Просмотр профиля
« Ответ #3 : Июнь 24, 2017, 21:32 »

То не собирается, выдаёт ошибки из qmetatype.h и qtypeinfo.h о том, что к этому франкенштейну и sizeof не применить, и тип его неполный.
Такое может быть из-за того, что тайпдеф до объявления Tester делается.
Записан

Код
C++ (Qt)
while(!asleep()) sheep++;
Crazy Sage
Гость
« Ответ #4 : Июнь 24, 2017, 21:35 »

Разобрался, оказывается в такой ситуации нельзя отправлять в сигнале слоте QVector<>, надо const QVector<>&, тогда всё работает.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.16 секунд. Запросов: 22.