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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: [решено] Куда девается содержимое первого таба при очистке?  (Прочитано 7066 раз)
serg_hd
Хакер
*****
Offline Offline

Сообщений: 668



Просмотр профиля
« : Январь 25, 2010, 20:02 »

есть QTabWidget myTabs, табы tab1, tab2, tab3 и метод:
Код
Java
public void func()
{
 myTabs.clear();
 
 QWidget tab1 = new QWidget();
 QWidget tab2 = new QWidget();
 QWidget tab3 = new QWidget();
 
 myTabs.addTab(tab1, "name1");
 myTabs.addTab(tab2, "name2");
 myTabs.addTab(tab3, "name3");
 
 QLabel label1 = new QLabel("label1", tab1);
 QLabel label2 = new QLabel("label2", tab2);
 QLabel label3 = new QLabel("label3", tab3);
}
 
который вызывается в 2 случаях - в первом случае когда запускается программа и во-втором, когда метод является слотом на какой-либо сигнал (в моём случае на pressed qpushbutton'a).
В первом случае, при загрузке, всё нормально - на каждом табе свой label. Как только вызываю метод сигналом, 1й таб сразу становится пустым, при этом на остальных label'ы на месте. Что не так?
« Последнее редактирование: Январь 25, 2010, 20:36 от serg_hd » Записан

kubuntu/Win7/x64/NetBeans
serg_hd
Хакер
*****
Offline Offline

Сообщений: 668



Просмотр профиля
« Ответ #1 : Январь 25, 2010, 20:18 »

хотя если в методе дописать
Код
Java
System.out.println(myTabs.widget(0));
 
то показывает, что виджет на месте.
Записан

kubuntu/Win7/x64/NetBeans
DS_tm
Гость
« Ответ #2 : Январь 25, 2010, 20:19 »

Сложно судить, вообще на лицо утечка памяти, может дело в этом. При вызове myTabs.clear() удаляет все указатели на виджеты из списка но не удаляет их самих.
Записан
serg_hd
Хакер
*****
Offline Offline

Сообщений: 668



Просмотр профиля
« Ответ #3 : Январь 25, 2010, 20:23 »

пробовал
Код
Java
 for (int i = 0; i <= myTabs.count(); i ++)
 {
  myTabs.removeTab(i);
  if ((myTabs.count() - i) == 0) break;
  i --;
 }
 
то же самое...
Записан

kubuntu/Win7/x64/NetBeans
DS_tm
Гость
« Ответ #4 : Январь 25, 2010, 20:31 »

Цитировать
void QTabWidget::removeTab ( int index )
Removes the tab at position index from this stack of widgets. The page widget itself is not deleted.

removeTab() тоже самое, что и clear(). Просто удаляет указатель на виджет.

Попробуйте вот так:
Код
C++ (Qt)
for (int i = 0, count = tabWidget->count(); i < count; ++i) {
   delete tabWidget->widget(0);
   tabWidget->removeTab(0);
}
 
Записан
serg_hd
Хакер
*****
Offline Offline

Сообщений: 668



Просмотр профиля
« Ответ #5 : Январь 25, 2010, 20:32 »

Поменял местами 2 последних блока:
Код
Java
public void func()
{
 myTabs.clear();
 
 QWidget tab1 = new QWidget();
 QWidget tab2 = new QWidget();
 QWidget tab3 = new QWidget();
 
 QLabel label1 = new QLabel("label1", tab1);
 QLabel label2 = new QLabel("label2", tab2);
 QLabel label3 = new QLabel("label3", tab3);
 
 myTabs.addTab(tab1, "name1");
 myTabs.addTab(tab2, "name2");
 myTabs.addTab(tab3, "name3");
}
 
Заработало. Но всё равно непонятно почему 1й вариант не работает, при repaint(), update() в том числе.
Записан

kubuntu/Win7/x64/NetBeans
serg_hd
Хакер
*****
Offline Offline

Сообщений: 668



Просмотр профиля
« Ответ #6 : Январь 25, 2010, 20:34 »

Цитировать
void QTabWidget::removeTab ( int index )
Removes the tab at position index from this stack of widgets. The page widget itself is not deleted.

removeTab() тоже самое, что и clear(). Просто удаляет указатель на виджет.

Попробуйте вот так:
Код
C++ (Qt)
for (int i = 0, count = tabWidget->count(); i < count; ++i) {
   delete tabWidget->widget(0);
   tabWidget->removeTab(0);
}
 

DS_tm, пасиб, но в java нет явного удаления объектов.
Записан

kubuntu/Win7/x64/NetBeans
DS_tm
Гость
« Ответ #7 : Январь 25, 2010, 20:38 »

Ам, не заметил, что речь о Jambi)

А вообще, как такое может быть, что операция создания есть, а операции удаления нет?
Записан
serg_hd
Хакер
*****
Offline Offline

Сообщений: 668



Просмотр профиля
« Ответ #8 : Январь 25, 2010, 20:39 »

Без понятия (касаемо jambi может и есть, но я не в курсе). Просто java сама удаляет объекты, если на них больше нет указателей.
« Последнее редактирование: Январь 25, 2010, 20:40 от serg_hd » Записан

kubuntu/Win7/x64/NetBeans
DS_tm
Гость
« Ответ #9 : Январь 25, 2010, 20:42 »

Так и какое решение в итоге? Интересно же)
Записан
serg_hd
Хакер
*****
Offline Offline

Сообщений: 668



Просмотр профиля
« Ответ #10 : Январь 25, 2010, 20:45 »

Просто переставить местами блоки (я выше привёл код). Добавлять к табам нужно уже "подготовленные" виджеты. Так конечно даже логически правильней, но всё равно непонятно, почему в первом варианте дефект только на 1м табе (без ошибок и т.п., просто он визуально пустой).
Записан

kubuntu/Win7/x64/NetBeans
DS_tm
Гость
« Ответ #11 : Январь 25, 2010, 20:53 »

Скорее всего вы сначала вызываете эту функцию, а потом делаете tableWidget->show(). Соответственно при show() происхоит перерисовка виджитов, и tabWidget понимает, что tab1 содержит QLabel. А когда выполняете эту функцию повторно, то tabWidget уже отображен, и следовательно выводит tab1 пустым, сразу после того, как вы его добавляете.
Записан
serg_hd
Хакер
*****
Offline Offline

Сообщений: 668



Просмотр профиля
« Ответ #12 : Январь 25, 2010, 21:23 »

Я ж написал что "не работает, при repaint(), update() в том числе". Проверял я это. И во-вторых, почему тогда другие два виджета отображаются?
Записан

kubuntu/Win7/x64/NetBeans
SABROG
Гость
« Ответ #13 : Январь 25, 2010, 21:54 »

Я ж написал что "не работает, при repaint(), update() в том числе". Проверял я это. И во-вторых, почему тогда другие два виджета отображаются?

Любому созданному виджету нужно вызывать show(), т.к. по умолчанию он спрятан. Если виджет является дочерним, то достаточно вызывать show() у главного виджета, тогда методы show() у всех деток он вызовет сам. У вас получается ситуация, когда первый виджет на экране удалил всех детей и даже когда ему их добавили show() у него повторно не вызывается в отличае от новых вкладок, которые спрятаны до того момента пока на них не кликнут. Попробуй вызывать show() у tab1, tab2, tab3 уже после того как на них были добавлены дети.
« Последнее редактирование: Январь 25, 2010, 22:04 от SABROG » Записан
serg_hd
Хакер
*****
Offline Offline

Сообщений: 668



Просмотр профиля
« Ответ #14 : Январь 25, 2010, 22:10 »

Любому созданному виджету нужно вызывать show(), т.к. по умолчанию он спрятан. Если виджет является дочерним, то достаточно вызывать show() у главного виджета, тогда методы show() у всех деток он вызовет сам. У вас получается ситуация, когда первый виджет на экране удалил всех детей и даже когда ему их добавили show() у него повторно не вызывается в отличае от новых вкладок, которые спрятаны до того момента пока на них не кликнут. Попробуй вызывать show() у tab1, tab2, tab3 уже после того как на них были добавлены дети.
Попробовать сейчас не смогу, т.к. код менять назад неохота. Но со сказанным согласен, уверен что заработало бы.
п.с. хотя опять же интересно почему помогла перестановка блоков, ведь show() я там нигде не применял, разве что если show() срабатывает сразу после addTab()...
« Последнее редактирование: Январь 25, 2010, 22:27 от serg_hd » Записан

kubuntu/Win7/x64/NetBeans
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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