LINUX.ORG.RU

автоматическое удаление объектов из списка

 ,


0

2

Чего то залип на одной задаче.

Имеем список объектов QWidget*. QList или QVector или что то другое - не важно. В процессе работы «на другом конце вселенной» для QWidget* может вызваться deleteLater(). Как мне при этом автоматически удалить уничтоженный виджет из списка?

Пробовал привязываться к сигналу destroyed(), перебирать весь массив и удалять из него объекты с адресом sender(), но sender почему то не совпадает ни с одним имеющимся объектом.

sender()

Но ведь в destroyed() уже прилетает адрес объекта. И с ним в списке тоже ничего не совпадает?

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

С destroyed(QObject *obj) тоже

Может у тебя изначально destroyed() без аргументов был? Прототип слота не совпадал с прототипом сигнала и куте ничего не вызывало?

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

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

destroyed() без аргументов был

Вроде и так и так пробовал.

akinator ★★
() автор топика
Ответ на: комментарий от yoghurt

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

Начиная с Qt5 — такие ошибки детектируются при компиляции (с новым синтаксисом сигнал-слотов).

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

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

если коннектить в стиле c++11 - то в compile time

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

Не только в стиле С++11, если соединять указатели на функции-члены, то тоже в компайл-тайм.

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

С переездом на Qt5 — хороший повод минимизировать использование старого синтаксиса (полностью, увы, я не смог избавиться).

Новые сигнал-слоты не только проверяются в компайл-тайме, но и намного быстрее (меньше процессорного времени тратится на вызов слота), а ещё можно в качестве слотов использовать простые функции (не обязательно лямбды из C++11 или помеченные функции класса кейвордом slots).

Chaser_Andrey ★★★★★
()
Последнее исправление: Chaser_Andrey (всего исправлений: 1)
Ответ на: комментарий от Chaser_Andrey

полностью, увы, я не смог избавиться

в том-то и проблема - легаси. хотя он, как правило, уже отлажен

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

Проблема в моем случае не в legacy, а в том, что мне просто не удалось заставить работать новые сигнал-слоты в неком исключительном случае (надо посмотреть, вспомнить, почему).

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

Почему не удалось? У меня удалось везде.

Как на счёт «QTimer::singleShot»? Ещё пару таких мест встречал... Или уже пофиксили?

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