LINUX.ORG.RU

Вызовется ли слот, если указатель на объект изменили после connect() ?

 , , ,


0

2

Есть у меня виджет, в котором при нажатии кнопки «Cancel» испускается сингнал cancelDownload. Этот сигнал связывается со слотом объекта QNetworkReply *networkReply;

  networkReply=webManager.get(request);
  connect( this, SIGNAL(cancelDownload()), networkReply, SLOT(abort()) );

В процессе работы может оказаться ситуация, что вместо данных придет редирект, и заново выполнится код с новым запросом:
networkReply=webManager.get(request);

в результате, указатель networkReply изменится. А он же ранее был связан со слотом через connect().

Вопрос. Нужно ли пересоздавать connect() сигнала-слота в такой ситуации? То есть, во внутренностях Qt напрямую используется значение указателя, или значение указателя копируется в какую-то таблицу в момент connect()?

★★★★★

Да, нужно. Второй networkReply будет новым объектом и к нему нет никаких сигналов.

networkReply кстати не забываешь удалить после finished()?

ncuxer
()

Объект в C++ живет по тому адресу, по какому родился. То есть имеется взаимно однозначное соответствие. Поэтому вопрос здесь может стоять например так: если объект уничтожается, то чистятся ли при этом автоматически соединения в Qt? Ответ - да:

QObject::~QObject()

Destroys the object, deleting all its child objects.

All signals to and from the object are automatically disconnected, and any pending posted events for the object are removed from the event queue. However, it is often safer to use deleteLater() rather than deleting a QObject subclass directly.

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

asaw ★★★★★
()

То есть, во внутренностях Qt напрямую используется значение указателя, или значение указателя копируется в какую-то таблицу в момент connect()?

Для ответа на этот вопрос достаточно посмотреть сигнатуру connect(). Чтобы Qt мог использовать то значение указателя networkReply, которое ты присвоил уже после вызова connect(), в connect() нужно было бы передать указатель или ссылку на networkReply. Но networkReply передается по значению, как QObject*, а не QObject** или QObject*&.

annulen ★★★★★
()

connect( this, SIGNAL(cancelDownload()), networkReply, SLOT(abort()) );

лучше коннектить по новому, старый способ имеет недостатки

x905 ★★★★★
()
Ответ на: комментарий от annulen

Но networkReply передается по значению, как QObject*

Фак мой мозг. Сигнатура QObject* - это передача объекта по значению?

anonymous
()
Ответ на: комментарий от annulen

Слушай, а если передавать ссылку куте сам не догадается обновить активные референсы? Мне кажется это маловероятным, но вдруг?

anonymous
()
Ответ на: комментарий от anonymous

Нет никаких «вдруг», сигнатура connect жестко определяет правила. Если бы у connect была перегрузка с другими типами, тогда да, она могла бы например делать то, что хочет ТС.

annulen ★★★★★
()
Ответ на: комментарий от trex6

Сколько помню ТС, ему такие советы года три уже раздают..

UVV ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.