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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Вставка строки в табличная модель и предупреждение QSortFilterProxyModel  (Прочитано 3414 раз)
demaker
Птица говорун
*****
Offline Offline

Сообщений: 960


Просмотр профиля
« : Сентябрь 13, 2016, 13:40 »

Есть табличная модель у нее есть проксимодель.
Пытаюсь сделать вставку строки
Код:
void DataBaseModel::prepareInsertData()
выдается сообщение в Консоль:
Код:
 QSortFilterProxyModel: invalid inserted rows reported by source model
Не знаю что делать Непонимающий
Вот код:
Табличная модель
Код
C++ (Qt)
DataBaseModel::DataBaseModel(QObject *parent) :
   QAbstractTableModel(parent)
{
   sqlModel = new SqlTableModel("ALGORITHMS");
   sqlModel->setQuery("SELECT * FROM ALGORITHMS");
 
   QSqlQuery query("SELECT * FROM ALGORITHMS");
   QSqlRecord rec = query.record();
   int amountColumn = rec.count();
 
   while(query.next()){
       QStringList *dataRecord = new QStringList;
       for(int i = 0; i < amountColumn; i++){
           QString str = query.value(i).toString();
           dataRecord->append(str);
       }
       dataRecords.append(dataRecord);
   }
 
    countDataBaseRecords = dataRecords.count();
}
 
DataBaseModel::~DataBaseModel()
{
}
 
Qt::ItemFlags DataBaseModel::flags(const QModelIndex &index) const
{
   Qt::ItemFlags flags = QAbstractTableModel::flags(index);
   flags |= Qt::ItemIsEditable;
   return flags;
}
 
int DataBaseModel::rowCount(const QModelIndex &parent) const
{  
   return dataRecords.count();
}
 
int DataBaseModel::columnCount(const QModelIndex &parent) const
{    
   return sqlModel->record().count();
}
 
QVariant DataBaseModel::data(const QModelIndex &index, int role) const
{
 
   if(!index.isValid() ||
          dataRecords.count() <= index.row() ||
          (role != Qt::DisplayRole && role != Qt::EditRole))
       return QVariant();
 
   return dataRecords.at(index.row())->at(index.column());
}
 
bool DataBaseModel::setData(const QModelIndex &index, const QVariant &value, int role)
{  
   if(index.isValid()){
       dataRecords.at(index.row())->operator [](index.column()) = value.toString();
       if(index.row() <= countDataBaseRecords){
           return sqlModel->setData(index,value,role); //автоматический update данных
       }
       return true;
   }
   return false;
}
 
QVariant DataBaseModel::headerData(int section, Qt::Orientation orientation, int role) const
{
   if(role == Qt::DisplayRole && orientation == Qt::Horizontal)
   {
       return sqlModel->record().fieldName(section);
   }
   else if(role == Qt::DisplayRole && orientation == Qt::Vertical){
       return section + 1;
   }
   return QVariant();
}
 
void DataBaseModel::prepareInsertData()
{    
   int lastRow = rowCount(QModelIndex());
 
   lastRow++;//????
 
   int amountColumn = columnCount(QModelIndex());
   beginInsertRows(QModelIndex(),lastRow,lastRow);
   QStringList * dataRecord = new QStringList;
   for(int i = 0; i < amountColumn; dataRecord->append(""),i++);
   dataRecords.append(dataRecord);
   insertRecords.append(dataRecord);
   endInsertRows();    
}
 
void DataBaseModel::cancelInsertData()
{
   int lastRow = rowCount(QModelIndex());
   qDebug()<<lastRow;
   beginRemoveRows(QModelIndex(),lastRow,lastRow);
 
   endRemoveRows();
}
 
void DataBaseModel::deleteData(QModelIndex index)
{
   int code = sqlModel->data(QAbstractTableModel::index(index.row(),0,QModelIndex())).toInt();
   if(sqlModel->deleteRow(code)){
       beginRemoveRows(QModelIndex(),index.row(),index.row());
       delete dataRecords.at(index.row());
       dataRecords.removeAt(index.row());
       countDataBaseRecords--;             //уменьшаем общее количество строк на одну удаленную строку
       endRemoveRows();
   }
}
 
void DataBaseModel::insertData()
{          
   int countInsertRows = sqlModel->insertRows(&insertRecords); //количество добавленных строк
   for(int i = 0; i < countInsertRows; i++){
       setData(index(countDataBaseRecords + i,0),sqlModel->insertCodes.at(i).toString(),Qt::DisplayRole);
   }
   countDataBaseRecords += countInsertRows; //увеличиваем общее количество строк на количество добавленных строк
   insertRecords.clear();
 
   //Q_EMIT updateView();
}
 
QString DataBaseModel::getNameTable()
{
   return "ALGORITHMS";
}
 
bool DataBaseModel::insertRecordsIsEmpty()
{
   return insertRecords.isEmpty();
}
 

Пытаемся сделать вставку по инсерту
Код
C++ (Qt)
void TableView::keyPressedEvent(QKeyEvent *event)
{
DataBaseModel *dataBaseModel = (DataBaseModel*)(((DataBaseFilterModel*)model())->sourceModel());
  if(event->key() == Qt::Key_Insert)
    dataBaseModel->prepareInsertData();
}
 

Подключение прокси модели
Код
C++ (Qt)
dbModel = new DataBaseModel(this);
proxyModel = new DataBaseFilterModel(this);
proxyModel->setSourceModel(dbModel);
ui->tableView->setModel(proxyModel);
 
« Последнее редактирование: Сентябрь 13, 2016, 15:03 от demaker » Записан
demaker
Птица говорун
*****
Offline Offline

Сообщений: 960


Просмотр профиля
« Ответ #1 : Сентябрь 13, 2016, 17:32 »

Всем спасибо разобрались
не надо делать никакого инкремента  в lastRow
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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