Название: 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 испарится очень быстро. Ну а до этого можно поизображать "иронию" :) Вот пример (псевдокод) тяжелого бага из моей практики Код Хотя это и не 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 Проще выражаясь, вывод: еще раз повторю, в случае использования delete вам точно известен момент, когда указатели становятся невалидными и разрываются все сигнал-слотовые соединения.Если перед вызовом deleteLater вызвать слот disconnect, то deleteLater по опасности равен оператору delete. Так? PS остальные доводы я считаю несущественными, ибо они относятся к delete тоже. update: Igors, давайте отсеивать "нестабильную работу" и "опасность". Дисконнект отсеет опасность сигналов-слотов. Крах цикла событий в редких случаях нормален. PPS я так понимаю, приведённый вами код выполнится через неопределённое время, при стабильной работе цикла событий? сам же факт использования deleteLater() предполагает, что вы хотите пользоваться объектом еще некоторое время после вызова. то есть, вам нужны валидные указатели и, возможно, сигнал-слоты. время же удаления объекта может варьироваться в зависимости от различных факторов и в целом менее предсказуемо. Название: Re: deleteLater(),close() Отправлено: Bepec от Май 08, 2013, 16:47 Эм? deleteLater предполагает удаление после выполнения всех остальных евентов. Всё. Он ничего не означает более. И зануление используемого указателя, как и при использовании delete вас спасёт.
Проще выражаясь - выполняет всё то, что должен был ДО момента вызова deleteLater и убиение объекта. И не подразумевается, что вы будете использовать объект. Странник, то ли я вас не понимаю, то ли вы не понимаете работу deleteLater. Там посылается евент самому себе на уничтожение. Все евенты ДО него будут выполнены. После него никакого евента не будет. И вы же не используете удалённый delete указатель? Так почему же вы используете поставленный на удаление ? Название: Re: deleteLater(),close() Отправлено: thechicho от Май 09, 2013, 21:39 deleteLater() для асинхронного кодинга. если лень в слоте потом удалять, пишешь deleteLater()
|