Сигнал 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 копирует данные, чтобы не влиять на состояние базового объекта.
Для получения дополнительной информации посмотрите этот пост в блоге.