Поиск:

Ответ в темуСоздание новой темы Создание опроса
> удаление строк QTableView QAbstractTableModel[Qt], удаление пустых строк из таблицы 
V
    Опции темы
ss
Дата 31.1.2016, 20:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 133
Регистрация: 17.5.2007

Репутация: нет
Всего: нет



Здравствуйте форумчане. Помогите решить проблему :
есть таблица QTableView и переопределенная модель MyTableModel. Переопределяю модель т.к. у меня будет много данных > 100 тыс строк. их буду добавлять и удалять а стандартная модель QStandardItemModel это делает очень долго да и она не очень будет удобна для дальнейшего использования. Использовать QSortFilterProxyModel тоже не могу т.к. удаление будет сложным с некоторыми группами строк да и значение показа строки будут через отдельный массив индексов т.е. нужно именно переопределять и расширять самую простую модель.

Проблема заключается в этом :
 При удаление данных из модели в таблице остаются пустые ячейки строк. Как их удалить ?
Это ,наверно, связано с тем что я не удаляю index ?! Тогда где найти и как удалить индексы ячеек строк ?

З.Ы. строки должны удаляться после установки модели таблице т.к. добавляться или удаляться будут пользователем.

mytablemodel.h
Код

#include <QAbstractTableModel>
#include <QVector>
#include <QString>

class MyTableModel : public QAbstractTableModel
{
public:
    MyTableModel(QObject *parent = 0);


    int columnCount(const QModelIndex &parent) const Q_DECL_OVERRIDE{return _column;}
    int rowCount(const QModelIndex &parent) const Q_DECL_OVERRIDE{return _row;}


    Q_INVOKABLE QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const Q_DECL_OVERRIDE
    {
        //if(role == Qt::DisplayRole)
        return _data.at(index.row()).at(index.column());
    }

    void setData(int row, int column, const QString& data) { _data[row][column] = data;}

    void createCell(int row, int column);

    inline QModelIndex createIndex(int row, int column, void *data = 0) const;

    void removeRowM(int row);

protected:


private:
    QVector<QVector<QString> > _data;

    int _row;
    int _column;
};


mytablemodel.cpp
Код

#include "mytablemodel.h"

MyTableModel::MyTableModel(QObject *parent):
    QAbstractTableModel(parent)
{
}

void MyTableModel::createCell(int row, int column)
{
    _row = row;
    _column = column;


    _data.resize(row);

    for(int i = 0; i < row; ++i)
    {
        _data[i].resize(column);
    }

}

void MyTableModel::removeRowM(int row)
{
//---- строка перед удаляемой
    QString st("+");
    for(int i = 0; i < _column; ++i)
        _data[row-1][i] = st;
//----

    _data.removeAt(row);

    --_row;

}


mainwindow.cpp
Код

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);


//--------------- создание и заполнение модели произвольными данными
    MyTableModel * model = new MyTableModel;

    int n = 15, m = 5;

    model->createCell(n,m);

    for(int i = 0; i < n; ++i)
        for(int j = 0; j < m; ++j)
            model->setData(i,j,"st");
//---------------

    ui->tableView->setModel(model);

    model->removeRowM(8);
    model->removeRowM(10);
    model->removeRowM(12);
}

PM MAIL   Вверх
vlarry
Дата 7.2.2016, 21:00 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 153
Регистрация: 16.8.2009

Репутация: нет
Всего: нет



Добрый день.
Код

void MyTableModel::removeRowM(int row)
{
        beginRemoveRows(QModelIndex(), row, row);
                //---- строка перед удаляемой
               QString st("+");
               for(int i = 0; i < _column; ++i)
                       _data[row-1][i] = st;
               //----
               _data.removeAt(row);
               --_row;
        endRemoveRows();

        emit layoutChanged();
}


Это сообщение отредактировал(а) vlarry - 7.2.2016, 21:02
PM MAIL   Вверх
ss
Дата 9.2.2016, 22:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 133
Регистрация: 17.5.2007

Репутация: нет
Всего: нет



vlarry, спасибо. работает.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0405 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.