Название: Напонятно почему так работает программа Отправлено: Ovoshlook от Октябрь 16, 2010, 17:26 в общем пишу небольшую программу, точнее сначала начал писать но теперь решил преписать заново с небольшими доработками.
В общем проблема в том что в старой программе работала как надо а здесь почему то не совсем правильно. Я скину сюда саму прогу и если кому не сложно скачайте и протестите у себя. Просто может быть я уже не вижу в чем подвох, а вы так сказать сторонним глазом увидите. Суть проблемы: Создается табВиджет. По нажатию кнопки к нему добавляется новый таб. Есть возможноть через меню сбрасывать Таб виджет в началоное состояние и заново добавлять Табы. Когда я создаю в первый раз таб виджет и добавляю табы, то все происходит нормально, но когда сбрасываю и начинаю добавлять снова Табы то они добавляются сразу по нескольку, а точнее вот если я сбрасываю в первый раз то добавляется по 2 таба сразу, если я сбрасываю 2 раз то добавляется по 3 таба сразу.. Далее- реализовал возможность удаления таба, но удаляется тоже неправильно. Удаляется по 2 Таба сразу... Я понимаю что сложновато вот так все представить поэтому кидаю вам исходники. Посмотрите если кому не сложно. А то не пойму в чем дело.... Файл ReadMe вложил в архивчик. Архивчик тут http://webfile.ru/4820044. Заранее спасибо большое. P.S. писал в Qt 4.7 поэтому с более раннимим версиями возможна неправильная работа (на 4,6,3 у меня не совсем правильно работало). Название: Re: Напонятно почему так работает программа Отправлено: Anarion от Октябрь 16, 2010, 18:08 На счет удаления:
Код: void Question::DeleteTabForQuestion(QTabWidget *TabWidget) Как вариант: закомментировать вторую строчку ( delete TabWidget->currentWidget(); ). Думаю, что именно вторую, поскольку метод "TabWidget->removeTab" отработает более корректно. Название: Re: Напонятно почему так работает программа Отправлено: Anarion от Октябрь 16, 2010, 18:18 На счет множественного создания:
Код
При каждом выполнении действия "Create" вы соединяете сигнал нажатия кнопки со слотом создания новой закладки. Поэтому с каждым очередным нажатием количество создаваемых табов увеличивается. Как вариант решения: если параметры сигнала и слота не изменяются (в данном случае, да и не требуется в этой задаче), то соедините один раз, например в конце метода void OTS_MainWindow::createNewFormForQuestions(): Код
Название: Re: Напонятно почему так работает программа Отправлено: Ovoshlook от Октябрь 16, 2010, 18:29 C connect вы оказались правы за что вам огромное спасибо!!!!)) (Жаль здесь плюсиков нету)
Да и по поводу того чтобы закомментить строчку тоже все сработало. Просто я ставил delete TabWidget->currentWidget(); потому что в Ассистанте написало но remove удаляет вкладку, но виджет не удаляет, поэтому я боюсь что будет происходить утечка памяти. Разве не так? Я сейчас закомментил как раз строчку с remove (3-ю а не 2-ю) и все стало работать как надо. Визуально закладка удалилась. Вопрос: ЗАкладка так же удалилась из памяти? утечки не будет? Название: Re: Напонятно почему так работает программа Отправлено: Anarion от Октябрь 16, 2010, 19:07 Не могу сказать наверняка. Утечку памяти можно посмотреть через диспетчер задач, наблюдая за ней при создании/удалении нескольких закладок. Вообще, если уж delete удаляет, то скорее всего, удалит всё.
Название: Re: Напонятно почему так работает программа Отправлено: Ovoshlook от Октябрь 16, 2010, 19:16 Тем не менее спасибо огромное за помощь. ОЧ помогли!!! Тема закрыта!
Название: Re: Напонятно почему так работает программа Отправлено: lit-uriy от Октябрь 16, 2010, 19:32 >>Утечку памяти можно посмотреть через диспетчер задач,
не реально. Qt в некоторых случаях может не отдавать память немедленно Название: Re: Напонятно почему так работает программа Отправлено: Anarion от Октябрь 16, 2010, 22:38 Может быть все же реально в некоторых случаях? Например, я таким образом искал утечки при добавлении/удалении многих объектов QGraphicsItem, когда работал со сценой. Когда создавал 30-40 элементов, объем памяти, которое занимало приложение, заметно увеличивался (на 7-8 Мб). И вот таким образом определял, при вызове каких методов память освобождается сразу. Иначе, если память не освобождается сразу, то от чего в таком случае зависит время до ее освобождения?
|