Russian Qt Forum
Июнь 16, 2024, 04:21 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: [РЕШЕНО] Вылет при использовании QAbstractTableModel  (Прочитано 3473 раз)
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 окна вылетает, вроде делал по примерам, не могу понять в чем ошибка.
« Последнее редактирование: Май 24, 2014, 14:54 от Achernar » Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #1 : Май 24, 2014, 14:25 »

Проверьте в GameTable::data строку return m_data[index.row()][index.column()];  Улыбающийся
Похоже тут выход за пределы массива Улыбающийся
Записан

Achernar
Гость
« Ответ #2 : Май 24, 2014, 14:37 »

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

gil9red % на 80 прав, я думаю Улыбающийся
Сделай проще свою систему - повтыкай в начале изменения данных либо qDebug либо в лог выводи данные о перемещениях. Так и отловишь сочетания "Бум барах".
Записан
Achernar
Гость
« Ответ #4 : Май 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();


}
« Последнее редактирование: Май 24, 2014, 14:47 от Achernar » Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #5 : Май 24, 2014, 19:33 »

gil9red % на 80 прав, я думаю Улыбающийся
Сделай проще свою систему - повтыкай в начале изменения данных либо qDebug либо в лог выводи данные о перемещениях. Так и отловишь сочетания "Бум барах".

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

Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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