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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Прокси-модель растёт в два раза быстрее исходной.  (Прочитано 2505 раз)
lexaaleynik
Гость
« : Март 28, 2016, 20:41 »

Имеется модель построенная на переопределённом 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() для прокси модели и для исходной, то каждый раз они отличаются в два раза.

Кто виноват и что делать?
Записан
lexaaleynik
Гость
« Ответ #1 : Март 29, 2016, 09:35 »

Upd: Подставил свою модель в стандартный пример basicsortfiltermodel - всё работает корректно. Размеры прокси и исходной модели одинаковые после добавления записей через insertRows().

Ай нид хэлп Обеспокоенный
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #2 : Март 29, 2016, 09:40 »

Читай документацию внимательнее: beginInsertRows(parent, row, row);
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
lexaaleynik
Гость
« Ответ #3 : Март 29, 2016, 10:10 »

Читай документацию внимательнее: beginInsertRows(parent, row, row);

Всё, спасибо. При вызове этой функции в методе insertRows() последний параметр нужно было уменьшать на 1 (вместо beginInsertRows(parent, row, row + count) нужно было beginInsertRows(parent, row, row + count - 1) ).

Аналогично c removeRows().
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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