Russian Qt Forum

Qt => Вопросы новичков => Тема начата: demaker от Апрель 22, 2013, 09:59



Название: deleteLater(),close()
Отправлено: demaker от Апрель 22, 2013, 09:59
deleteLater(),close() в чем принципиальная разница между этими слотами?


Название: Re: deleteLater(),close()
Отправлено: Bepec от Апрель 22, 2013, 10:01
deleteLater удаляет объект когда он уже не нужен. Но не обязательно сей момент.
close  считай убивает виджет :)


Название: Re: deleteLater(),close()
Отправлено: demaker от Апрель 22, 2013, 10:02
спасибо  :)


Название: Re: deleteLater(),close()
Отправлено: KrupaKarlo от Май 06, 2013, 12:50
Документация к функции close()

Closes this widget. Returns true if the widget was closed; otherwise returns false.
First it sends the widget a QCloseEvent. The widget is hidden if it accepts the close event. If it ignores the event, nothing happens. The default implementation of QWidget::closeEvent() accepts the close event.
If the widget has the Qt::WA_DeleteOnClose flag, the widget is also deleted. A close events is delivered to the widget no matter if the widget is visible or not.

В вольном переводе close() не убивает виджет если нет флага Qt::WA_DeleteOnClose.
И еще если все окна GUI приложения закрыть  - приложение завершается. Так что вас вводят в заблуждение. Проверяйте что вам пишут  :)


Название: Re: deleteLater(),close()
Отправлено: Странник от Май 06, 2013, 15:56
строго говоря, deleteLater() создает задание на удаление объекта, которое выполняется при следующем заходе в цикл событий. если этого не учитывать, может быть неприятно = )


Название: Re: deleteLater(),close()
Отправлено: Bepec от Май 06, 2013, 16:19
А если у виджета переопределён closeEvent c отказом виджет не закроется :D

PS а принципиальная разница во втором сообщении ;)


Название: Re: deleteLater(),close()
Отправлено: KrupaKarlo от Май 06, 2013, 21:25

Полный атас. стандартное поведение close() просто закрыть виджет. И да при этом вызывается closeEvent который можно обработать и изменить поведение. но блин причем тут
Цитировать
close  считай убивает виджет



Название: Re: deleteLater(),close()
Отправлено: Bepec от Май 06, 2013, 21:30
Кхм. Почитай про значение слова считай :D

http://expo.art-royal.net/?name=dal&sw=%D1%81%D1%87%D0%B8%D1%82%D0%B0%D0%B9

PS граммар наци на форуме? :D


Название: Re: deleteLater(),close()
Отправлено: KrupaKarlo от Май 07, 2013, 16:26
народ подскажите плиз, а есть ли способ неких пользователей добавить в  бан лист и не видеть их сообщений


Название: Re: deleteLater(),close()
Отправлено: Bepec от Май 07, 2013, 17:21
Нет, на форуме нет такого функционала. Администрация придерживается нейтралитета :)

Да, есть такой функционал, реализованный в скрипте :P Я его сам использовал, пока некая личность не покинула форум ;)

PS возможность есть, повод для саморазвития есть, вперёд ;)


Название: Re: deleteLater(),close()
Отправлено: Igors от Май 07, 2013, 17:44
deleteLater(),close() в чем принципиальная разница между этими слотами?
Избегайте deleteLater(), он опасен, чреват неприятными последствиями


Название: Re: deleteLater(),close()
Отправлено: Bepec от Май 07, 2013, 18:37
Кхм. Прощу вас, Igors, поведайте нам об опасности deleteLater.


Название: Re: deleteLater(),close()
Отправлено: Akon от Май 08, 2013, 10:39
demaker:
Когда-нибудь столкнетесь с ситуацией, когда deleteLater() будет нужен, просто пучувствуете это. Ну, или поищите deleteLater() в сорцах Qt, чтобы посмотреть зачем он нужен.

Верес:
имхо, ваши посты малоинформативны и, зачастую, технически некорректными. Т.е. слов много, а по делу мало.


Название: Re: deleteLater(),close()
Отправлено: Bepec от Май 08, 2013, 12:11
Спасибо Akon, учту ваше замечание. Может вы поможете мне исправиться? Пожалуйста укажите мне мои ошибки. Желательно с цитированием и указанием "ошибок".

Но, на мой взгляд, они информативны и являют собой моё мнение. То, что некоторые не замечают слов "может быть", "я так думаю", "я так считаю", "это моё мнение", "считай", "наверно" - это проблема внимательности.

PS deleteLater() рекомендуется использовать в классе QNetworkReply.


Название: Re: deleteLater(),close()
Отправлено: Странник от Май 08, 2013, 13:14
избегать можно всего, в том числе и программирования (как особо чреватого неприятными последствиями). полезнее знать и учитывать механизм работы, используя инструменты при необходимости и по назначению.


Название: Re: deleteLater(),close()
Отправлено: RedDog от Май 08, 2013, 13:27
По наблюдениям, в Qt гораздо опаснее использовать обычный delete, нежели deleteLater().


Название: Re: deleteLater(),close()
Отправлено: Alex Custov от Май 08, 2013, 13:44
По наблюдениям, в Qt гораздо опаснее использовать обычный delete, нежели deleteLater().

Это зависит от каждой конкретной ситуации. Где-то по логике вещей нужно deleteLater(), где-то это будет избыточно.


Название: Re: deleteLater(),close()
Отправлено: Bepec от Май 08, 2013, 14:26
Но кто-нибудь напишет, ЧЕМ опасен deleteLater?

Конкретику пожалуйста приведите, сторонники "опасности".


Название: Re: deleteLater(),close()
Отправлено: Странник от Май 08, 2013, 15:15
Но кто-нибудь напишет, ЧЕМ опасен deleteLater?

Конкретику пожалуйста приведите, сторонники "опасности".
delete удаляет объект здесь и сейчас, поэтому понятен и прозрачен.
deleteLater() удаляет объект там и потом, поэтому предсказать его поведение бывает сложно. а это чревато и обращением по невалидному указателю (когда eventloop получил управление и удалил объект раньше, чем вы ожидаете), и чехардой с сигналами-слотами (когда объект перед своим удалением успевает получить-отправить непредвиденные сигналы). не переусложняйте и да воздастся вам.


Название: Re: deleteLater(),close()
Отправлено: Igors от Май 08, 2013, 15:34
Но кто-нибудь напишет, ЧЕМ опасен deleteLater?

Конкретику пожалуйста приведите, сторонники "опасности".
Те опасности известны задолго до появления Qt, поэтому я, право, удивлен настойчивыми вопросами  :) Что делает deleteLater? Засылает в очередь событие удаления. А сколько еще событий в той очереди? Да хз, может и сотни других, и пока дело дойдет до удаления, объект живет полной жизнью, напр принимает/испускает те же сигналы и.т.п. Бывают случаи когда это желательно, но чаще нет, а безболезненно "обесточить" объект обычно трудно. В конце-концов eventLoop могут и грохнуть, и объект повиснет.

Наступив разок на эти грабли и потеряв неск дней на такую заморочку - энтузиазм к deleteLater испарится очень быстро. Ну а до этого можно поизображать "иронию"  :)

Вот пример (псевдокод) тяжелого бага из моей практики
Код
C++ (Qt)
PostEvent(eventCreateJob, jobID);
PostEvent(eventStartJob, jobID, param);
 
Хотя это и не deleteLater, но "из той же оперы"



Название: Re: deleteLater(),close()
Отправлено: Bepec от Май 08, 2013, 15:38
Проще выражаясь, вывод:

Если перед вызовом deleteLater вызвать слот disconnect, то deleteLater по опасности равен оператору delete.

Так?

PS остальные доводы я считаю несущественными, ибо они относятся к delete тоже.

update:
Igors, давайте отсеивать "нестабильную работу" и "опасность".

Дисконнект отсеет опасность сигналов-слотов.

Крах цикла событий в редких случаях нормален.

PPS я так понимаю, приведённый вами код выполнится через неопределённое время, при стабильной работе цикла событий?



Название: Re: deleteLater(),close()
Отправлено: Igors от Май 08, 2013, 15:43
PPS я так понимаю, приведённый вами код выполнится через неопределённое время, при стабильной работе цикла событий?
Ну если я засылаю события в очередь - я тем самым соглашаюсь с "неопределённым временем", это не проблема. Не спешите с ответами - Вас ведь никто не гонит  :)


Название: Re: deleteLater(),close()
Отправлено: Bepec от Май 08, 2013, 15:56
Ну тогда разве что события прошли друг за другом, но объект ещё не успел создаться.

Инциденты:

1) слишком долгая доставка; (нормально)
2) слишком быстрая доставка; (объект не успевает создаться, задача не выполняется)
3) нарушение цикла событий; (! исключительная ситуация)
4) что-то внешнее, чего придумать не могу.

хм. Вроде всё.


Название: Re: deleteLater(),close()
Отправлено: Странник от Май 08, 2013, 16:39
Проще выражаясь, вывод:

Если перед вызовом deleteLater вызвать слот disconnect, то deleteLater по опасности равен оператору delete.

Так?

PS остальные доводы я считаю несущественными, ибо они относятся к delete тоже.

update:
Igors, давайте отсеивать "нестабильную работу" и "опасность".

Дисконнект отсеет опасность сигналов-слотов.

Крах цикла событий в редких случаях нормален.

PPS я так понимаю, приведённый вами код выполнится через неопределённое время, при стабильной работе цикла событий?


еще раз повторю, в случае использования delete вам точно известен момент, когда указатели становятся невалидными и разрываются все сигнал-слотовые соединения.
сам же факт использования deleteLater() предполагает, что вы хотите пользоваться объектом еще некоторое время после вызова. то есть, вам нужны валидные указатели и, возможно, сигнал-слоты. время же удаления объекта может варьироваться в зависимости от различных факторов и в целом менее предсказуемо.


Название: Re: deleteLater(),close()
Отправлено: Bepec от Май 08, 2013, 16:47
Эм? deleteLater предполагает удаление после выполнения всех остальных евентов. Всё. Он ничего не означает более. И зануление используемого указателя, как и при использовании delete вас спасёт.

Проще выражаясь - выполняет всё то, что должен был ДО момента вызова deleteLater и убиение объекта. И не подразумевается, что вы будете использовать объект.

Странник, то ли я вас не понимаю, то ли вы не понимаете работу deleteLater. Там посылается евент самому себе на уничтожение. Все евенты ДО него будут выполнены. После него никакого евента не будет.

И вы же не используете удалённый delete указатель? Так почему же вы используете поставленный на удаление ?


Название: Re: deleteLater(),close()
Отправлено: thechicho от Май 09, 2013, 21:39
deleteLater() для асинхронного кодинга. если лень в слоте потом удалять, пишешь deleteLater()