crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> QTabWidget. setTabsClosable(). Закрытие табов, коннект tabCloseRequested(int)
fe120
  опции профиля:
сообщение 8.2.2010, 22:28
Сообщение #1


Студент
*

Группа: Новичок
Сообщений: 13
Регистрация: 6.1.2010
Пользователь №: 1354

Спасибо сказали: 1 раз(а)




Репутация:   0  


Всем доброго времени суток.
Занимаюсь разбирательством с QMainWindows и QTabWidget. С первым впрочем все понятно. Со вторым же возникла следующая проблема:
Необходимо по нажатию на кнопку closetab на самой табе соответственно и закрывать табу.
Создание табы реализовано следующим образом:
widgetOnTab* mainWidget::createCompositionTab(){    
    widgetOnTab* newWidget = new widgetOnTab();
    compositionTabs->addTab(newWidget,trUtf8("Таб")+QString::number(compositionTabs->count()));
    connect(compositionTabs,SIGNAL(tabCloseRequested(int)),SLOT(closeCompositionTab(int)));
    return newWidget;
}
void mainWidget::closeCompositionTab(int index){
    compositionTabs->removeTab(index);
}

При такой реализации получается что табы успешно создаются по нажатию кнопки, а уничтожаются,при нажатии на closetab, несколько не понятно,
а точнее уничтожаются все табы находящиеся после закрываемой,включая закрываемую.
более чем уверен что ошибка кроется в моей невнимательности...
На изображениях ниже показаны эти ситуации(сверху вниз)
1 - созданы 7 табов.
2 - наводим на кнопку closetab 4 табы
3 - после нажатия убираются табы 4 - 7 включительно.
Раскрывающийся текст

Ниже представлен полный код создания окна:
Раскрывающийся текст
#include "mainWindow.h"
//#include <QtSql>

mainWindow::mainWindow(){
    mainMenu = new QMenu;

    setCentralWidget(new mainWidget());
}

widgetOnTab::widgetOnTab(QWidget* pwgt/*=0*/) : QWidget(pwgt){
    layoutOnTabWidget = new QGridLayout;
    layoutOnTabWidget->setMargin(1);
    compositionTable = new QTableWidget;
    layoutOnTabWidget->addWidget(compositionTable);
    setLayout(layoutOnTabWidget);
}

widgetOnTab* mainWidget::createCompositionTab(){    
    widgetOnTab* newWidget = new widgetOnTab();
    compositionTabs->addTab(newWidget,trUtf8("Таб")+QString::number(compositionTabs->count()));
    connect(compositionTabs,SIGNAL(tabCloseRequested(int)),SLOT(closeCompositionTab(int)));
    return newWidget;
}

void mainWidget::closeCompositionTab(int index){
    compositionTabs->removeTab(index);
}

mainWidget::mainWidget(QWidget* pwgt/*= 0*/) : QWidget(pwgt){
    layoutOnMainWidget = new QGridLayout;
    layoutOnMainWidget->setMargin(0);
    compositionTabs = new QTabWidget;
    compositionTabs->removeTab(0);
    anyButton = new QPushButton(tr("lol"));
    anybutton2 = new QPushButton(tr("lol2"));
    connect(anybutton2,SIGNAL(clicked()),SLOT(createCompositionTab()));
    connect(anyButton,SIGNAL(clicked()),SLOT(closeCompositionTab()));
    compositionTabs->setTabsClosable(true);
    layoutOnMainWidget->addWidget(compositionTabs,0,1,1,4);
    layoutOnMainWidget->addWidget(anyButton,1,0,1,1);
    layoutOnMainWidget->addWidget(anybutton2,1,1,1,1);
    mainWidget::setLayout(layoutOnMainWidget);
}

так же интересует следующее: при removeTab(index) происходит ли delete виджета который добавлен на табу, или же нада вручную сперва удалять виджет, а только после ремовить табу.

Заранее большое спасибо откликнувшимся на возникшую проблемку.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 8.2.2010, 23:01
Сообщение #2


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Добавь в функцию
Цитата(fe120 @ 9.2.2010, 1:28) *
void mainWidget::closeCompositionTab(int index)
строку:
qDebug() << "closeCompositionTab, index =" << index;
Собери программу в режиме отладки с консолью. И посмотри что будет выводить в консоль.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
fe120
  опции профиля:
сообщение 8.2.2010, 23:14
Сообщение #3


Студент
*

Группа: Новичок
Сообщений: 13
Регистрация: 6.1.2010
Пользователь №: 1354

Спасибо сказали: 1 раз(а)




Репутация:   0  


хм..
вновь создал 7 табов, жму на закрытии 4-ой, в консоли следующее:
closeCompositionTab, index = 4 
closeCompositionTab, index = 4
closeCompositionTab, index = 4
closeCompositionTab, index = 4
closeCompositionTab, index = 4
closeCompositionTab, index = 4
closeCompositionTab, index = 4
closeCompositionTab, index = 4

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

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 9.2.2010, 2:21
Сообщение #4


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


fe120, А версия Qt какая?

Вот мой тест (все вкладки статические, созданы в дизайнере):
Прикрепленный файл  Qt_test_16.zip ( 2,78 килобайт ) Кол-во скачиваний: 258

Проверил на Qt 4.5.3 и Qt 4.6.0
MinGW/Виндовоз 2к

Багу НЕ подтверждаю
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
fe120
  опции профиля:
сообщение 9.2.2010, 12:20
Сообщение #5


Студент
*

Группа: Новичок
Сообщений: 13
Регистрация: 6.1.2010
Пользователь №: 1354

Спасибо сказали: 1 раз(а)




Репутация:   0  


и правду говорят утро вечера мудренее...
нашел абсолютно глупейшую ошибку...

А что касательно 2 вопроса?
Необходимо ли вручную удалять виджет привязанный к табе, для освобождения памяти?
Или же любезный QTabWidget::removeTab(index), все организует сам?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 9.2.2010, 12:45
Сообщение #6


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(fe120 @ 9.2.2010, 15:20) *
Необходимо ли вручную удалять виджет привязанный к табе, для освобождения памяти?
Или же любезный QTabWidget::removeTab(index), все организует сам?
а что написано в доке про removeTab?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
fe120
  опции профиля:
сообщение 9.2.2010, 19:52
Сообщение #7


Студент
*

Группа: Новичок
Сообщений: 13
Регистрация: 6.1.2010
Пользователь №: 1354

Спасибо сказали: 1 раз(а)




Репутация:   0  


Ich verstehe =))

Removes the tab at position index from this stack of widgets. The page widget itself is not deleted.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 9.2.2010, 20:16
Сообщение #8


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(fe120 @ 9.2.2010, 22:52) *
not deleted.
вот и ответ на твой вопрос.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_Гость_*
сообщение 12.8.2010, 11:26
Сообщение #9





Гости








    


и какая же ошибка была?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 27.11.2024, 11:57