Сигнал Qt и слоты: копируются ли ссылочные аргументы?

В среде qt большинство библиотечных сигналов и слотов используют указатели в качестве параметров. Мне было интересно, если я создам "структуру" сигнального слота, которая принимает указатель в качестве параметра вместо указателя, будет ли скопирован весь параметр или просто 4 байта (32-разрядная система), как в обычной ссылке на C++?

Я спрашиваю об этом, потому что я заметил что-то, когда я создаю методы сигнал / слот с опорным параметром. Когда я тогда connect их, механизм автозаполнения в QTCreator не намекает мне на ссылочные параметры, как он делал бы с параметрами указателя. Он намекает мне обычным параметром. Например:

Я создаю сигнал и слот:

...
signals:
     void mySignal(int& parameter);
private slots:
     void on_mySignal(int& parameter);

Затем я пытаюсь подключить их и Qt не добавляет & для справки в параметре:

...
connect(this, SIGNAL(mySignal(int)), this, SLOT(on_mySignal(int)));

Я должен вручную изменить на:

connect(this, SIGNAL(mySignal(int&)), this, SLOT(on_mySignal(int&)));

Таким образом, мне интересно, справка даже работает с сигналом / слотом? Буду признателен за любую помощь.

1 ответ

Решение

Если вы отправляете и получаете ссылку в том же потоке, по умолчанию копия не будет создаваться. Если вы делаете что-либо еще, включая отправку / получение значения или отправку ссылки на другой поток, будет сделана одна, две или даже три копии.

Что происходит, зависит от типа соединения и заверений, которые QT должна знать, что ссылки остаются действительными во время вызова. Прямое соединение в том же потоке разрешается простым вызовом функции, поэтому с базовыми данными может произойти очень мало. Однако соединение в очереди не дает никаких гарантий относительно того, когда вызов действительно произойдет, поэтому QT сделает копии для сохранения целостности данных. QT неявно ставит в очередь сигналы, пересекающие границы потоков.

Если любая из сторон является передачей по значению, QT копирует данные, чтобы не влиять на состояние базового объекта.

Для получения дополнительной информации посмотрите этот пост в блоге.

Другие вопросы по тегам