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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: [РЕШЕНО] кривое отображение в QSortFilterProxyModel при вставке  (Прочитано 4803 раз)
unkeep
Гость
« : Апрель 18, 2013, 10:58 »

source - SqlTreeModel
view - QSortFilterProxyModel
При обычной вставке всё норм. Но если вставить уровень, а потом в него добавить подуровень, то вместе с ним в Прокси модель добавляются пустые строки(от 1 до 9+. не уследил закономерности). Причём такая проблема только на 2м уровне. Проверил  в дебаге, оказалось, что при вставке строки на втором уровне она вставляется сразу с детьми(от 1-9+). Причём в исходной модели всё чётко. Индексы моделей не путаю. Преобразовывать не забываю.

для наглядности вывожу в дебаге количество детей (вставил строку->выделил её->вывел инфу->вставил подстроку->вывел инфу)

--------------------------
0 - source model rows(before)
1 - view model rows(before) QVariant(QString, "15.9") //до вставки
"INSERT INTO documents.modules (id_module, master_id_module, n_module, name_module) VALUES(4644, 4642, '15.9.0', 'без названия') RETURNING id_module"
1 - source model rows(after)
2 - view model rows(after) //после вставки
----------------------------

откуда эта шляпа вылазит - ума не приложу. третий день голову ломаю
« Последнее редактирование: Апрель 19, 2013, 12:35 от unkeep » Записан
Bepec
Гость
« Ответ #1 : Апрель 18, 2013, 12:01 »

Нет вменяемого кода, нет практически ничего. Как по такому судить можно?
Записан
unkeep
Гость
« Ответ #2 : Апрель 18, 2013, 12:13 »

Нет вменяемого кода, нет практически ничего. Как по такому судить можно?
методы в порядке вызова :

Код
C++ (Qt)
void TextModuleEditorDialog::on_addBtn_clicked()
{
   QModelIndex index = _ui->treeView->currentIndex();
   if (index.isValid())
   {
       qlonglong parentID = _controller->GetModuleID(index);
       qlonglong newID = _controller->GetNextID();
       ModulePtr module = ModulePtr(new Module());
       module->SetModuleID(newID);
       module->SetMasterID(parentID);
       QStringList freeNumbers = _controller->GetFreeModuleNumbers(index);
       if (freeNumbers.isEmpty())
       {
           _controller->SendMessage("Can not insert",this,MessageLevel::Error);
           return;
       }
       _ui->treeView->expand(index);
       AddOrEditDialog *addDialog = new AddOrEditDialog(module,freeNumbers,this);
       addDialog->setWindowTitle("Inserting");
       if (addDialog->exec() == QDialog::Accepted)
       {
           addDialog->UpdateModuleData();
           if (_controller->InsertModule(module,index))
           {
               _controller->SendMessage("Module is inserted",this,MessageLevel::Success);
           }
       }
 
   }
   else
   {
       _controller->SendMessage("Set parent module!",this,MessageLevel::Error);
   }
}



Код
C++ (Qt)
bool ModelsController::InsertModule(ModulePtr module, QModelIndex viewParent)
{
   QModelIndex viewIndex = viewParent;
   QModelIndex sourseIndex = SourceIndex(viewParent);
   qDebug()<<"--------------------------";
   qDebug()<<_data->rowCount(SourceIndex(viewParent)) <<"- source model rows(before)";
   qDebug()<<_view->rowCount(viewParent) <<"- view model rows(before)" ;
   bool isInserted = _data->InsertModule(module,SourceIndex(viewParent));
   qDebug()<<_data->rowCount(SourceIndex(viewParent)) <<"- source model rows(after)";
   qDebug()<<_view->rowCount(viewParent) <<"- view model rows(after)";
   qDebug()<<"----------------------------";
 
   return isInserted;
}

Код
C++ (Qt)
bool ModulesModel::InsertModule(ModulePtr module, QModelIndex parent)
{   bool result = false;
   QMap<QString, QVariant> map;
   map[Modules::Columns::number] = module->ModuleN();
   map[Modules::Columns::name] = module->ModuleName();
   result = insertChild(parent,map);
   QModelIndex indexTL = index(0,0,parent);
   QModelIndex indexBR = index(rowCount(parent),columnCount(parent),parent);
   emit dataChanged(indexTL,indexBR);
   return result;
}

Код
C++ (Qt)
bool SqlTreeModel::insertChild(const QModelIndex &parent, const QMap<QString, QVariant> &data)
{
   bool success = true;
   IdType parentId = GetId(parent);
   beginInsertRows(parent,0,0);
   if (d->insertChild(parentId,data) == 0)
   {
       success = false;
   }
   endInsertRows();
   return success;
}

Код
C++ (Qt)
IdType TreeData::insertChild( IdType parent, const QMap<QString, QVariant>& data )
{
TreeNode* parentNode = node(parent);
if ( !parentNode )
return 0;
 
// TEST
if (_isManualSubmit)
{
IdType newId = GetNextId();
TreeNode* newNode = new TreeNode;
newNode->id = newId;
newNode->parent = parent;
newNode->modification = Inserted;
 
for ( int i = 0; i < _dataNames.count(); i++ )
{
QString name = _dataNames[i];
QVariant value;
if (name == _idName)
value = newNode->id;
else if (name == _parentName)
value = newNode->parent;
else
value = data[name];
 
newNode->data.append( value );
}                
               _history.insert(newId, newNode);
 
parentNode->children.append(newId);
return newId;
}
// END TEST
 
QSqlQuery query(_db);
QStringList names = data.keys();
QStringList values;
   IdType newId = GetNextId();
foreach ( QVariant value, data.values() ) {
values.append( QString("'%1'").arg(value.toString()) );
}
names.prepend( _parentName );
values.prepend(QString("%1").arg(parent) );
names.prepend( _idName );
   values.prepend(QString("%1").arg(newId) );
   QString queryStr = QString( "INSERT INTO %1 (%2) VALUES(%3) RETURNING %4" )
.arg(_tableName)
.arg(names.join(", "))
.arg(values.join(", "))
.arg(_idName);
   qDebug()<<queryStr;
   if (!query.exec(queryStr) )
{
qDebug() << query.lastError().text();
return 0;
}
if (!query.next())
{
qDebug() << query.lastError().text();
return 0;
}
 
IdType id = query.value(0).toLongLong();
 
if ( id )
parentNode->children.append(id);
return id;
}
« Последнее редактирование: Апрель 18, 2013, 12:19 от unkeep » Записан
Bepec
Гость
« Ответ #3 : Апрель 18, 2013, 12:23 »

Ну что сказать - берите дебаггер и ловите особенно в добавлении детей.

Я лично не вижу тут повторных добавлений, но очень много скрыто вашей спецификой Подмигивающий

PS дали бы проект, я б дебаггером поковырялся.  ( %90 что не дадите - много специфики Веселый )
Записан
unkeep
Гость
« Ответ #4 : Апрель 18, 2013, 12:46 »

Ну что сказать - берите дебаггер и ловите особенно в добавлении детей.
ничего не видно там. Весь процесс добавления модуля в модель и базу правильный на 100%. Я подозреваю что проблема обновления данных в прокси из исходной модели(физически этих глючных  строк не существует, они только в представлении).

дали бы проект, я б дебаггером поковырялся.
базу не смогу дать. а без базы никуда.
Записан
Bepec
Гость
« Ответ #5 : Апрель 18, 2013, 12:58 »

А давайте подумаем вместе.

Данные строки имеются только в представлении. Т.е. в модели их нет. Верно? Допустим.

Идём дальше.

Представление отрисовывает строки, основываясь на данных и сигналах из модели. Верно? Доспустим.

Идём дальше.

Если появляются пустые строки, которых нет в модели, значить виновата функция добавления строк в модель. Верно? Допустим.

Идём дальше.

С учётом того, что пустые, никуда не относящиеся строки могут появляться из-за неверных вызовов ф-ций (точнее сигналов, но да ладно) beginInsertRow, следовательно надо проверить все эти места. Верно? Допустим.

Потому бежим к проекту, цепляем дебаггер и пробуем смотреть что у нас получается шаг за шагом.

Если это баг - то возможно воссоздать ситуацию в простейшем тестовом проекте.
Если в этом виноват ваш код - переписывайте его.
Записан
unkeep
Гость
« Ответ #6 : Апрель 18, 2013, 13:10 »

спасибо. буду пробывать завтра
Записан
unkeep
Гость
« Ответ #7 : Апрель 19, 2013, 12:21 »

нашёл закономерность.
до вставки:
  • уровень   
    • модуль 1(детей1)
    • модуль 2(детей1)
    • модуль 3(детей6)
         

после вставки:
  • уровень   
    • модуль 1(детей1)
    • модуль 2(детей1)
    • модуль 3(детей1)
    • новый модуль 4(детей6)
         



всё дело было в beginInsertRows()
было
Код
C++ (Qt)
beginInsertRows(parent,0,0);

сделал
Код
C++ (Qt)
beginInsertRows(parent,position,position);
всё работает! спасибо за подсказку
Записан
Bepec
Гость
« Ответ #8 : Апрель 19, 2013, 12:23 »

На здоровье. [РЕШЕНО] в название темы и закрываааем Улыбающийся

PS обращайся.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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