Есть табличная модель у нее есть проксимодель.
Пытаюсь сделать вставку строки
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);