Название: Не удаляется окно с виджетом если в него загружен текст в разметке html Отправлено: Silentium от Сентябрь 28, 2011, 09:43 Добрый день. Не нашел подобной темы потому решил написать вопрос.
И так, у меня много оконное приложение. существует класс "привратник" потомок QObject, который запускает все окна по определенному алгоритму. Проблема возникла с окнами, которые он загружает. Предполагалось, что это диалоговые окна на базе QWidget. В них загружается текст в формате html (ничего сложного только теги <p> и <font>). Загружается все прекрасно, а вот, когда окно надо закрыть(отдельной кнопкой) - окно как бы повисает, но реагирует на кнопку закрытия окна. При этом если сразу после этого запускаю следующие окно все нормально. уничтожение происходит так: по сигналу выполняется слот, в котором уничтожаются все виджиты, а потом посылается сигнал close. Если загружать обычный текст то все происходит прекрасно, окно уничтожается. Побывал создавать как модальный диалог -тот же эффект. Прошу помочь советом. Название: Re: Не удаляется окно с виджетом если в него загружен текст в разметке html Отправлено: Bepec от Сентябрь 28, 2011, 10:23 А указать всем виджетам родителя (то окно виджет), и в слоте закрытия просто вызвать close() ???
Попытаюсь сча смоделировать ситуацию. Название: Re: Не удаляется окно с виджетом если в него загружен текст в разметке html Отправлено: Silentium от Сентябрь 28, 2011, 10:49 не вышло
вот как выглядит слот Код: delete ok_label; Код: ok_button = new QPushButton; Код: central_layout->addWidget(warning_label,Qt::AlignAbsolute); Код: QFile file; Название: Re: Не удаляется окно с виджетом если в него загружен текст в разметке html Отправлено: Bepec от Сентябрь 28, 2011, 13:08 Мб конечно я не понимаю вашего стремления, но зачем все создавать динамически?
Можно просто создать форму (в Designer'e), навтыкать лейблов, кнопок, и нестандартно воткнуть лейблы на кнопки (не видел реализацию, не скажу как и что) И в последующем весь твой слот будет выглядеть просто - Код: // удаление нестандартных лейблов Конечно желательно посмотреть весь твой проект. Еще как вариант: создавай кнопки и прочее не new, а в виде private: переменных. И опять-таки у них будет виджет родителем и при его закрытии они сами уничтожатся. PS твоих целей незнаю, потому мои советы могут быть некстати. Название: Re: Не удаляется окно с виджетом если в него загружен текст в разметке html Отправлено: Silentium от Сентябрь 28, 2011, 13:16 Спасибо буду думать. Мне, честно, не нравится дезигнер предпочитаю все создавать ручками - мне так понятнее. Странно просто то ,что такой казус возникает только, когда загружен текст в штмл, если загружу обычный текст все будет хорошо (кстати первый раз запускается нормально, на 3 перезапуск начинает виснуть). В конце концов обойдусь без html пусть это и будет более хлопотно! Спасибо за беспокойство
Название: Re: Не удаляется окно с виджетом если в него загружен текст в разметке html Отправлено: andrew.k от Сентябрь 28, 2011, 13:22 хочешь ручками, делай ручками, но зачем писать лишний код?
присваивай родителя и он сам удалится в деструкторе. И ошибок меньше будет. button = new QPushButton (this); Такой батон удалять не надо. Название: Re: Не удаляется окно с виджетом если в него загружен текст в разметке html Отправлено: Silentium от Сентябрь 28, 2011, 13:41 Да если this не написать он тоже поймет кто родитель этого "батона" и прекрасно его удалит. Проблема в другом, что если загружен html текст, то если верить gdb он даже не попадает в слот просто вешается. А вот при принудительном уничтожение главного виджета (клавиша закрытия окна) он уничтожается, но приложение то повисает, а когда нет html нет.
Название: Re: Не удаляется окно с виджетом если в него загружен текст в разметке html Отправлено: Bepec от Сентябрь 28, 2011, 13:44 to Silentium: объект удалится, но память не освободится и появится утечка памяти. Что в дальнейшем фатально.
Можешь скинуть свой проект? Просто видимо у тебя там с сигналами что то. (если конечно проект не закрытый и платный :) ) to andrew.k: спасибо за наводку - ток сейчас осознал что: только Qtшные объекты удалятся, если у них будет родитель, и он будет прибит. Думал раньше на Сишный лад. Название: Re: Не удаляется окно с виджетом если в него загружен текст в разметке html Отправлено: Silentium от Сентябрь 28, 2011, 13:46 ща накропаю тестовое приложение в одно окно без сценариста попробую так. Еще есть вероятность что конфликт идет с операционкой - но это врядли.
Название: Re: Не удаляется окно с виджетом если в него загружен текст в разметке html Отправлено: andrew.k от Сентябрь 28, 2011, 14:19 Да если this не написать он тоже поймет кто родитель этого "батона" и прекрасно его удалит. Проблема в другом, что если загружен html текст, то если верить gdb он даже не попадает в слот просто вешается. А вот при принудительном уничтожение главного виджета (клавиша закрытия окна) он уничтожается, но приложение то повисает, а когда нет html нет. Интересно как это он поймет? Если this не передать в конструктор, то автоматически он не удалится. И его нужно удалить самостоятельно. Название: Re: Не удаляется окно с виджетом если в него загружен текст в разметке html Отправлено: Silentium от Сентябрь 28, 2011, 14:27 Видимо тему закрываю,. По крайней мере тестовый пример работает. значит как говорил старый анекдот ошибка в рибонуклеиновой кислоте. Действительно не показатель указание родителя. Ошибка видимо идет на уровне класса привратника а значит буду думать. Выложу рабочий тестовый пример
widget.cpp Код: #include "widget.h" Код: #ifndef WIDGET_H Код: #include <QtGui/QApplication> Название: Re: Не удаляется окно с виджетом если в него загружен текст в разметке html Отправлено: Bepec от Сентябрь 28, 2011, 14:38 Лучше б нерабочий выложил, так бы хоть разобрались где ошибка.
Спасибо создателю темы и andrew.k - с помощью нее уложил еще 1 кирпичик знаний у себя :) Название: Re: Не удаляется окно с виджетом если в него загружен текст в разметке html Отправлено: Silentium от Сентябрь 28, 2011, 18:20 Ура ошибка найдена. Правда не понятно почему и империческим путем. Виной всему было наложение лайблов на кнопки если их не накладывать то проблем нет.То есть получается при уничтожение их происходит ошибка.
Приведу последний код рабочий cpp Код: #include "age_enquirer.h" Код: #ifndef AGE_ENQUIRER_H Код: #include <QtGui/QApplication> Название: Re: Не удаляется окно с виджетом если в него загружен текст в разметке html Отправлено: Bepec от Сентябрь 29, 2011, 09:25 Блин да оладушки - прошу же нерабочую версию :) а ты меня рабочими кормишь :)
Выложи нерабочую версию в архиве тут (ну или на файлообменнике каком нить), тогда и разберемся. ^^ Название: Re: Не удаляется окно с виджетом если в него загружен текст в разметке html Отправлено: Silentium от Сентябрь 29, 2011, 09:44 я проблема оказалась банальна, когда понял в чем дело нашел подобную на форуме. Смысл такой приложение не может понять откого происходит событие cliked, а точнее оно считает что событие произошло не для кнопки, а для лайбла и ничего не делает. Когда нет ввода в лайбел html текста он имеет размер в пиксель и клик приходит правильно, когда же лайбел заполняет всю кнопку нажать на кнопку просто нельзя. А текст кстати именно тот, я просто нафиг выкинул класс привратник - он нафиг не нужен.
Название: Re: Не удаляется окно с виджетом если в него загружен текст в разметке html Отправлено: Bepec от Сентябрь 29, 2011, 09:46 Понятно) Еще 1 проблема решена. В принципе можно было просто связать клик на метку с кликом кнопки, но эт бабушка надвое сказала. Тему можно закрывать :)
Название: Re: Не удаляется окно с виджетом если в него загружен текст в разметке html Отправлено: Silentium от Сентябрь 29, 2011, 09:52 на самом деле, как оказалось проще из Qlabel - сделать кнопку которая будет нормально воспринимать html как раз смотрю одну из реализаций
вот здесь вот http://www.prog.org.ru/topic_6457_15.html (http://www.prog.org.ru/topic_6457_15.html) Название: Re: Не удаляется окно с виджетом если в него загружен текст в разметке html Отправлено: andrew.k от Сентябрь 29, 2011, 10:07 А что кнопка может быть контейнером для других виджетов?
Название: Re: Не удаляется окно с виджетом если в него загружен текст в разметке html Отправлено: Silentium от Сентябрь 29, 2011, 10:14 Да впринципе, что угодно может быть контейнером. Я однажды ради интереса кнопку засунул в QTextLine. QWidget может быть контейнером для других виджетов, а почему его потомки не могут быть токовыми?
Название: Re: Не удаляется окно с виджетом если в него загружен текст в разметке html Отправлено: andrew.k от Сентябрь 29, 2011, 10:16 Ну да логично.
Название: Re: Не удаляется окно с виджетом если в него загружен текст в разметке html Отправлено: Silentium от Сентябрь 29, 2011, 11:03 я уже стаким сталкивался(с подобной ошибкой), При перехвати с клавиатуры приложение тоже может путатся какой элемент обрабатывается(обработка идет с низу вверх) и если перехват описан на основном виджете, то может не перехватываться в более верхних и т.п. А вот тут не додумкал сразу чето.
|