Russian Qt Forum

Qt => Model-View (MV) => Тема начата: Tomopatchate от Апрель 22, 2010, 22:16



Название: Добавление элементов в QStandardItemModel
Отправлено: 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 начал использовать относительно недавно. Очень много времени уходит на отладку  :-\


Название: Re: Добавление элементов в QStandardItemModel
Отправлено: lit-uriy от Апрель 23, 2010, 01:28
>>При удалении соответствющего элемента возникает ошибка работы с памятью.
а как ты его удаляешь?


Название: Re: Добавление элементов в QStandardItemModel
Отправлено: Tomopatchate от Апрель 23, 2010, 01:37
Модель использую для отображения дерева (QTreeView).
Для удаления всех элементов пишу:

Код:
  if( model->rowCount() )
    model->removeRows( 0, model->rowCount() );
 


Название: Re: Добавление элементов в QStandardItemModel
Отправлено: lit-uriy от Апрель 23, 2010, 08:34
ну я не вижу ни какого криминала. Скорее всего проблема не в этой части кода


Название: Re: Добавление элементов в QStandardItemModel
Отправлено: Tomopatchate от Апрель 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 - завтыкал я :o

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