Russian Qt Forum

Qt => Model-View (MV) => Тема начата: Achernar от Май 24, 2014, 13:26



Название: [РЕШЕНО] Вылет при использовании QAbstractTableModel
Отправлено: Achernar от Май 24, 2014, 13:26
Здравствуйте, модель в виде таблицы из 3х столбцов и от 0 строк, унаследовал от QAbstractTableModel

Код:
#ifndef GAMETABLE_H
#define GAMETABLE_H

#include <QtCore/QAbstractTableModel>
#include <QtCore/QVector>
#include <QtCore/QString>

class GameTable : public QAbstractTableModel
{Q_OBJECT
public:
    GameTable(QObject * = 0);
    void getNewData();

protected:
    QVariant data(const QModelIndex&, int = Qt::DisplayRole) const;
    int rowCount(const QModelIndex&) const;
    int columnCount(const QModelIndex&) const;
    bool insertRows(int row, int count, const QModelIndex & parent = QModelIndex());
    bool removeRows(int row, int count, const QModelIndex & parent = QModelIndex());

private:
    QVector<QVector<QString> > m_data;
    QVector<QVector<QString> > new_data;

public slots:
    void addRow(QVector<QVector<QString> >);
};

Код:
#endif // GAMETABLE_H

#include "gametable.h"

GameTable::GameTable(QObject *parent) : QAbstractTableModel(parent)
{

}

QVariant GameTable::data(const QModelIndex &index, int nRole) const
{
    if (!index.isValid())
    {
        return QVariant();
    }

    if(nRole == Qt::DisplayRole)
        return m_data[index.row()][index.column()];
}

int GameTable::rowCount(const QModelIndex&) const
{
    return m_data.size();
}

int GameTable::columnCount(const QModelIndex&) const
{
    return 3;
}

bool GameTable::insertRows(int row, int count, const QModelIndex & parent)
{
    beginInsertRows(parent, row, row + count - 1);
    getNewData();
    endInsertRows();
    return true;
}

bool GameTable::removeRows(int row, int count, const QModelIndex & parent)
{
    beginRemoveRows(parent, row, row + count - 1);
    getNewData();
    endRemoveRows();
    return true;
}

void GameTable::addRow(QVector<QVector<QString> > data)
{
    new_data = data;
    insertRows(0, 1);
}

void GameTable::getNewData()
{
    m_data = new_data;
}

При добавлении строк и resize окна вылетает, вроде делал по примерам, не могу понять в чем ошибка.


Название: Re: Вылет при использовании QAbstractTableModel
Отправлено: gil9red от Май 24, 2014, 14:25
Проверьте в GameTable::data строку return m_data[index.row()][index.column()];  :)
Похоже тут выход за пределы массива :)


Название: Re: Вылет при использовании QAbstractTableModel
Отправлено: Achernar от Май 24, 2014, 14:37
Вообще это таблица для вывода ходов шахматной партии.
Вот такая ситуация делаю первый ход - посылается сигнал:
1. Иногда отрабатывает нормально - ход появляется в списке, но при resize вылетает, вызывается m_data[0][0] и после возвращения из функции вылетает.
2. Иногда сразу же вылетает, даже не попадая в функцию data(), причем ход тот же самый.


Название: Re: Вылет при использовании QAbstractTableModel
Отправлено: Bepec от Май 24, 2014, 14:42
gil9red % на 80 прав, я думаю :)
Сделай проще свою систему - повтыкай в начале изменения данных либо qDebug либо в лог выводи данные о перемещениях. Так и отловишь сочетания "Бум барах".


Название: Re: Вылет при использовании QAbstractTableModel
Отправлено: Achernar от Май 24, 2014, 14:44
Нашел в data() не возвращал значение по умолчанию, вот так работает:
Код:
QVariant GameTable::data(const QModelIndex &index, int nRole) const
{
    if (!index.isValid())
    {
        return QVariant();
    }

    if(nRole == Qt::DisplayRole)
        return m_data[index.row()][index.column()];

return QVariant();


}


Название: Re: Вылет при использовании QAbstractTableModel
Отправлено: gil9red от Май 24, 2014, 19:33
gil9red % на 80 прав, я думаю :)
Сделай проще свою систему - повтыкай в начале изменения данных либо qDebug либо в лог выводи данные о перемещениях. Так и отловишь сочетания "Бум барах".

И все равно не угадал ))