Имеется модель построенная на переопределённом QAbstractItemModel. Данные ячеек храняться в объекте класса Vector2dRoles.
Заголовочный файл vector2droles.h:
#ifndef VECTOR2DROLES_H
#define VECTOR2DROLES_H
#include <QVector>
#include <QColor>
#include "global_variables.h"
extern int numModelColumns;
class Vector2dRoles
{
public:
Vector2dRoles();
Vector2dRoles(int _sizeX, int _sizeY);
void appendRow(QColor _clr, QString _str);
void delRow(int numRow);
QVector< QVector< QString > > str;
QVector< QVector< QColor > > clr;
private:
QString dftStr;
QColor dftClr;
};
#endif // VECTOR2DROLES_H
Файл исходных кодов vector2droles.cpp:
#ifndef VECTOR2DROLES_H
#define VECTOR2DROLES_H
#include <QVector>
#include <QColor>
#include "global_variables.h"
extern int numModelColumns;
class Vector2dRoles
{
public:
Vector2dRoles();
Vector2dRoles(int _sizeX, int _sizeY);
void appendRow(QColor _clr, QString _str);
void delRow(int numRow);
QVector< QVector< QString > > str;
QVector< QVector< QColor > > clr;
private:
QString dftStr;
QColor dftClr;
};
#endif // VECTOR2DROLES_H
Реализация модели довольно большая, я сюда добавлю основное:
Часть заголовочного файла mymodel.h модели:
#ifndef MYMODEL_H
#define MYMODEL_H
#include <QAbstractTableModel>
#include <vector2droles.h>
#include "global_variables.h"
extern int numModelColumns;
class MyModel : public QAbstractTableModel
{
Q_OBJECT
public:
explicit MyModel(int _rows, QObject *pobj = 0);
MyModel(const MyModel &myMdl);
int rowCount(const QModelIndex &parent = QModelIndex()) const ;
int columnCount(const QModelIndex &parent = QModelIndex()) const;
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;
bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole);
bool insertRows(int row, int count, const QModelIndex &parent = QModelIndex());
bool removeRows(int row, int count, const QModelIndex &parent = QModelIndex());
Основные переопределённые методы модели (файл mymodel.cpp):
MyModel::MyModel(int _rows, QObject *pobj) : QAbstractTableModel(pobj)
{
numModelColumns = 54;
vec = new Vector2dRoles(_rows, numModelColumns);
}
MyModel::MyModel(const MyModel &myMdl)
{
numModelColumns = 54;
vec = new Vector2dRoles(myMdl.rowCount(), myMdl.columnCount());
}
int MyModel::rowCount(const QModelIndex & /*parent*/) const
{
return vec->str.size();
}
int MyModel::columnCount(const QModelIndex & /*parent*/) const
{
return numModelColumns;
}
QVariant MyModel::data(const QModelIndex &index, int role) const
{
if(role == Qt::DisplayRole)
return vec->str[index.row()][index.column()];
if(role == Qt::BackgroundColorRole)
return vec->clr[index.row()][index.column()];
return QVariant();
}
bool MyModel::setData(const QModelIndex & index, const QVariant & value, int role)
{
if((role == Qt::DisplayRole) || (role == Qt::EditRole)) {
emit cellDataChanged(index);
vec->str[index.row()][index.column()] = value.toString();
return true;
}
if(role == Qt::BackgroundColorRole) {
vec->clr[index.row()][index.column()] = value.toString();
return true;
}
return false;
}
bool MyModel::insertRows(int row, int count, const QModelIndex &parent)
{// row=1, always
beginInsertRows(parent, row, row + count);
vec->appendRow(QColor(Qt::white), "");
endInsertRows();
return true;
}
bool MyModel::removeRows(int row, int count, const QModelIndex &parent)
{// row=1, always
beginInsertRows(parent, row, row + count);
vec->delRow(row);
endInsertRows();
return true;
}
insertRows() в моём случае рассчитан на добавление по одной строке.
Имеется прокси-модель на стандартном QSortFilterProxyModel (не переопределена).
используется она так:
mdl = new MyModel(0);
proxyMdl = new QSortFilterProxyModel;
proxyMdl->setSourceModel(mdl);
proxyMdl->setDynamicSortFilter(true);
tbl = new My_table(proxyMdl, true, this);
При заполнении исходной модели с помощью insertRows(), прокси модель растёт в числе строк в два раза быстрее. То есть при каждом добавлении строки в исходную модель в прокси-модель вырастает в размере с коэффициентом 2 относительно исходной. Когда вызываешь rowCount() для обеих моделей, после insertRow() для прокси модели и для исходной, то каждый раз они отличаются в два раза.
Кто виноват и что делать?
Upd: Подставил свою модель в стандартный пример basicsortfiltermodel - всё работает корректно. Размеры прокси и исходной модели одинаковые после добавления записей через insertRows().
Ай нид хэлп :-[
Читай документацию внимательнее: beginInsertRows(parent, row, row);
Всё, спасибо. При вызове этой функции в методе insertRows() последний параметр нужно было уменьшать на 1 (вместо beginInsertRows(parent, row, row + count) нужно было beginInsertRows(parent, row, row + count - 1) ).
Аналогично c removeRows().