Russian Qt Forum
Ноябрь 24, 2024, 16:38 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Напонятно почему так работает программа  (Прочитано 4126 раз)
Ovoshlook
Гость
« : Октябрь 16, 2010, 17:26 »

в общем пишу небольшую программу, точнее сначала начал писать но теперь решил преписать заново с небольшими доработками.
В общем проблема в том что в старой программе работала как надо а здесь почему то не совсем правильно.
Я скину сюда саму прогу и если кому не сложно скачайте и протестите у себя. Просто может быть я уже не вижу в чем подвох, а вы так сказать сторонним глазом увидите.

Суть проблемы:

Создается табВиджет. По нажатию кнопки к нему добавляется новый таб. Есть возможноть через меню сбрасывать Таб виджет в началоное состояние и заново добавлять Табы.


Когда я создаю в первый раз таб виджет и добавляю табы, то все происходит нормально, но когда сбрасываю и начинаю добавлять снова Табы то они добавляются сразу по нескольку, а точнее вот если я сбрасываю в первый раз то добавляется по 2 таба сразу, если я сбрасываю 2 раз то добавляется по 3 таба сразу..

Далее- реализовал возможность удаления таба, но удаляется тоже неправильно. Удаляется по 2 Таба сразу...

Я понимаю что сложновато вот так все представить поэтому кидаю вам исходники.
Посмотрите если кому не сложно. А то не пойму в чем дело....

Файл ReadMe вложил в архивчик.
Архивчик тут     http://webfile.ru/4820044.

Заранее спасибо большое.

P.S. писал в Qt 4.7 поэтому с более раннимим версиями возможна неправильная работа (на 4,6,3 у меня не совсем правильно работало).
Записан
Anarion
Гость
« Ответ #1 : Октябрь 16, 2010, 18:08 »

На счет удаления:
Код:
void Question::DeleteTabForQuestion(QTabWidget *TabWidget)

{
    delete TabWidget->currentWidget()->layout();
    delete TabWidget->currentWidget(); // Вы удаляете объект, соотвенно текущий Tab закрывает и currentIndex(как и currentTab) переходит на следующий
    TabWidget->removeTab(TabWidget->currentIndex()); //и тут Вы в очередной раз закрываете текущий tab. Таким образом закрываются 2 виджета.
}

Как вариант: закомментировать вторую строчку ( delete TabWidget->currentWidget(); ). Думаю, что именно вторую, поскольку метод "TabWidget->removeTab" отработает более корректно.
Записан
Anarion
Гость
« Ответ #2 : Октябрь 16, 2010, 18:18 »

На счет множественного создания:

Код
C++ (Qt)
void OTS_MainWindow::createNewTest()
{
    GlobalVaribles::NumberOfTab=0;
    DeleteAllWidgets(RightVBoxLayout);
    QuestionTabWidget= new QTabWidget;
 
    QuestionTabWidget->setTabPosition(QTabWidget::West);
 
    RightVBoxLayout->addWidget(QuestionTabWidget);
    addNewTabForQuestion();
 
 
    connect (addQuestionButton, SIGNAL (clicked()), this, SLOT (addNewTabForQuestion()));  //соединение при каждом вызове
}

При каждом выполнении действия "Create" вы соединяете сигнал нажатия кнопки со слотом создания новой закладки. Поэтому с каждым очередным нажатием количество создаваемых табов увеличивается. Как вариант решения: если параметры сигнала и слота не изменяются (в данном случае, да и не требуется в этой задаче), то соедините один раз, например в конце метода void OTS_MainWindow::createNewFormForQuestions():

Код
C++ (Qt)
void OTS_MainWindow::createNewFormForQuestions()
{
  ....
  connect (addQuestionButton, SIGNAL (clicked()), this, SLOT (addNewTabForQuestion()));
}
Записан
Ovoshlook
Гость
« Ответ #3 : Октябрь 16, 2010, 18:29 »

C connect вы оказались правы за что вам огромное спасибо!!!!)) (Жаль здесь плюсиков нету)

Да и по поводу того чтобы закомментить строчку тоже все сработало. Просто я ставил delete TabWidget->currentWidget(); потому что в Ассистанте написало но remove удаляет вкладку, но виджет не удаляет, поэтому я боюсь что будет происходить утечка памяти. Разве не так?
Я сейчас закомментил как раз строчку с remove (3-ю а не 2-ю) и все стало работать как надо. Визуально закладка удалилась. Вопрос: ЗАкладка так же удалилась из памяти? утечки не будет?
« Последнее редактирование: Октябрь 16, 2010, 18:32 от Ovoshlook » Записан
Anarion
Гость
« Ответ #4 : Октябрь 16, 2010, 19:07 »

Не могу сказать наверняка. Утечку памяти можно посмотреть через диспетчер задач, наблюдая за ней при создании/удалении нескольких закладок. Вообще, если уж delete удаляет, то скорее всего, удалит всё.
Записан
Ovoshlook
Гость
« Ответ #5 : Октябрь 16, 2010, 19:16 »

Тем не менее спасибо огромное за помощь. ОЧ помогли!!! Тема закрыта!
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #6 : Октябрь 16, 2010, 19:32 »

>>Утечку памяти можно посмотреть через диспетчер задач,
не реально. Qt в некоторых случаях может не отдавать память немедленно
Записан

Юра.
Anarion
Гость
« Ответ #7 : Октябрь 16, 2010, 22:38 »

Может быть все же реально в некоторых случаях? Например, я таким образом искал утечки при добавлении/удалении многих объектов QGraphicsItem, когда работал со сценой. Когда создавал 30-40 элементов, объем памяти, которое занимало приложение, заметно увеличивался (на 7-8 Мб). И вот таким образом определял, при вызове каких методов память освобождается сразу. Иначе, если память не освобождается сразу, то от чего в таком случае зависит время до ее освобождения?
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.09 секунд. Запросов: 23.