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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Добавление элементов в QStandardItemModel  (Прочитано 5999 раз)
Tomopatchate
Гость
« : Апрель 22, 2010, 22:16 »

Доброго времени суток
При работе с QT возникла следующая проблема.
Создан объект типа QStandardItemModel. Добавление элементов:
Код:
    QString text = "Node 1";
    QStandardItem* item = new QStandardItem();
    item->setText( text );
    model->appendRow( item ); // model - объект типа QStandardItemModel
 
При удалении соответствющего элемента возникает ошибка работы с памятью. Работает без ошибок только так:
Код:
    QString* text = new QString( "Node 1" );
    QStandardItem* item = new QStandardItem();
    item->setText( *text );
    model->appendRow( item );
Таким образом добавленный элемент удаляется нормально. Правильно ли писать таким образом? Если правильно, то откуда я могу знать, что строка должна быть создана динамически, если нет - то как правильно?  Непонимающий
При работе подобные вещи возникают постоянно - при динамически созданной переменной типа QString или QVariant работает нормально, при статически созданной - ошибки. При работе с QWidget понятно, что переменные нужно создавать динамически, т. к. "Parent" будет пытаться их удалить, а в случаях подобных этому?
Разъясните пожалуйста... Qt начал использовать относительно недавно. Очень много времени уходит на отладку  В замешательстве
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #1 : Апрель 23, 2010, 01:28 »

>>При удалении соответствющего элемента возникает ошибка работы с памятью.
а как ты его удаляешь?
Записан

Юра.
Tomopatchate
Гость
« Ответ #2 : Апрель 23, 2010, 01:37 »

Модель использую для отображения дерева (QTreeView).
Для удаления всех элементов пишу:

Код:
  if( model->rowCount() )
    model->removeRows( 0, model->rowCount() );
 
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #3 : Апрель 23, 2010, 08:34 »

ну я не вижу ни какого криминала. Скорее всего проблема не в этой части кода
Записан

Юра.
Tomopatchate
Гость
« Ответ #4 : Апрель 23, 2010, 17:00 »

Создал новый проект для тестирования. Проблема была действительно была не в QStandardItemModel. К примеру следующий код:

Код:
// запрос работает, но возникает вопрос - как удалить строку s, 
void Test1() {
  QString* s = new QString( "select * from \"AD_ProgramModule\"" );
  QSqlQuery query;
  query.prepare( *s );
  if( !query.exec() ) {
    QMessageBox::critical( this, "", tr( "Test query failed." ) );
    return;
  }
  while( query.next() ) { //
  }
  // если вызвать "delete s" - прога упадет после выхода из ф-ии
}

// запрос выполняется нормально, но после выхода из функции ошибки работы с памятью
void Test2() {
  QString s = "select * from \"AD_ProgramModule\"";
  QSqlQuery query;
  query.prepare( s );
  if( !query.exec() ) {
    QMessageBox::critical( this, "Test01", tr( "Test query failed." ) );
      return;
  }
  while( query.next() ) {
  }
}

Как оказалось, в проекте были подключены следующие либы:
QtCore4d.lib //debug version
QtGui4d.lib //debug version
QtSql4.lib  //release version - завтыкал я Шокированный

Подключать надо было ВСЕ библиотеки либо с отладочной инф-ой либо без.
Подключил по-людски, все заработало. И приведенный выше Test2() и Test1() с удалением строки перед выходом из ф-ии.
Так то  Улыбающийся

Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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