Хорошая практика для передачи аргументов в очереди - PullRequest
0 голосов
/ 29 января 2019

Я хочу простой и понятный пример того, как сделать механизм сигналов и слотов в очереди.Возьмите в качестве примера следующую строку.Подумайте, что obj1 - это объект функциональности бэкэнда, излучающий сигнал асинхронно из другого потока и подключенный к слоту в графическом интерфейсе (основной поток):

connect(obj1, SIGNAL(Mysignal(vector<mystruct> )), this, slot(myslot(vector <mystruct>)))

Я прочитал, что вы должны зарегистрировать типы (мета-типы).Пожалуйста, дайте четкие, простые и готовые к использованию строки кода для приведенного выше примера, который мне понадобится, чтобы ошибки во время выполнения, такие как vector, моя структура или строка не были определены, и т. Д. Я не сталкивался.

Кроме того, есть лучший способ справиться с этим, например, отправка указателей, например:

connect(obj1, SIGNAL(Mysignal(obj2 *)), this, slot(myslot(obj2 *)))

Obj2 содержит вектор mystruct.Нужно ли мне регистрировать obj2 с этими метатипами?

Если у кого-то есть опыт в этом, пожалуйста, поделитесь всеми вашими хорошими практиками и простыми фрагментами кода, я новичок в соединениях с очередями с аргументами.Пожалуйста, помогите.

1 Ответ

0 голосов
/ 29 января 2019

Если вы хотите подключиться к очереди, вам нужно вызвать connect с 5. параметром Qt::QueuedConnection.В противном случае вы получите прямое соединение внутри потока, откуда вы отправили сигнал. Редактировать: См. Комментарий Tobys ниже.

Вы должны заключить QVector <> в typedef, иначе регистрация не будет работать (ошибка? В Qt из камня).Также не используйте ссылки на ваш typedef, он также не будет работать.

Заголовок

typedef struct {
    int a;
    int b;
} mystruct;

typedef QVector<mystruct> myvector;
Q_DECLARE_METATYPE(myvector);

Источник

void MainWindow::test()
{
    qRegisterMetaType<myvector>();

    connect(this, SIGNAL(sigRec(myvector)), SLOT(slotRec(myvector)), Qt::QueuedConnection);
    mystruct x = {1,2};
    myvector v;
    v.append(x);
    emit sigRec(v);
}

void MainWindow::slotRec(myvector s)
{
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...