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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Утечка памяти в QTableWidget  (Прочитано 3331 раз)
OS2
Самовар
**
Offline Offline

Сообщений: 186



Просмотр профиля WWW
« : Май 19, 2010, 18:07 »

Всем доброго времени суток!
Столкнулся с непонятной утечкой памяти при удалении\добавлении строк в таблицу QTableWidget.
Имеется: указатель на объект, типа QTableWidget (с именем tableWidget_SM), в него добавляются элементы, типа QTableWidgetItem (у меня простая таблица, состоящая из N строк и 1 столбца). Как только кол-во элементов(строк) в таблице становится равным определенной величине, происходит удаление первой строки и уменьшение общего кол-ва строк на 1. Код ниже:

Код
C++ (Qt)
void CMyDlg::AddMessage( const QString &text )
{
static QFont fontMessage = QFont( "Tahoma", 8 );
tableWidget_SM->setUpdatesEnabled( false );
 
const QString szText = QString("> %1").arg(text);
const int i = tableWidget_SM->rowCount();
 
if( i == 2000 )
{
QTableWidgetItem *pDelitem = tableWidget_SM->takeItem( 0, 0 );
delete pDelitem;
 
tableWidget_SM->removeRow( 0 );
tableWidget_SM->setRowCount( 1999 );
}
 
tableWidget_SM->insertRow( i );
 
QTableWidgetItem* pColumn = new QTableWidgetItem();
pColumn->setFont( fontMessage );
pColumn->setText( szText );
 
tableWidget_SM->setItem( i, 0, pColumn );
tableWidget_SM->setUpdatesEnabled( true );
}

По идее все должно быть нормально и утечки памяти быть не должно(я же удаляю каждый раз объект QTableWidgetItem), однако на практике программа активно жрёт ресурсы (сообщения AddMessage() у меня могут приходить часто ~1000 раз в секунду).
Что в моем коде не верно? Подскажите, плизз…


Записан
spectre71
Гость
« Ответ #1 : Май 19, 2010, 18:40 »

        const int i = tableWidget_SM->rowCount();
Код:
         int i = tableWidget_SM->rowCount(); 

if( i == 2000 )
{
QTableWidgetItem *pDelitem = tableWidget_SM->takeItem( 0, 0 );
delete pDelitem;
 
tableWidget_SM->removeRow( 0 ); //удаляет строку
tableWidget_SM->setRowCount( 1999 ); // какой смысл  в этом
// чему здесь равен  tableWidget_SM->rowCount() == 1999 ; и чему i == 2000 !!!
                i--;
}
 
« Последнее редактирование: Май 19, 2010, 18:42 от Spectre » Записан
Kolobok
Гость
« Ответ #2 : Май 19, 2010, 18:49 »

Оправданно ли использование QTableWidget при такой большой активности?
Записан
OS2
Самовар
**
Offline Offline

Сообщений: 186



Просмотр профиля WWW
« Ответ #3 : Июнь 02, 2010, 13:24 »

 Улыбающийся
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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