Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: SIGSEGV при установлении модели ( QTableView->setModel )
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt Модель/Представление
avkushnarenko
Здравсвуйте, Уважаемые. При разработке интерфейса столкнулся с проблемой перманентного SIGSEGV при вызове метода ui->tableSorts->setModel(model);
Итак, имею некоторый тип
template <typename TFloat>
struct ParticleKind {

    ParticleKind(uint iid = 0): id(iid),
            min_radius(0.5),  max_radius(0.5),
            min_alpha(0.1),   max_alpha(1.00),
            min_density(1000), max_density(1000) {}
    ParticleKind(uint iid,
            TFloat r_min, TFloat r_max,
            TFloat a_min, TFloat a_max,
            TFloat dens_min, TFloat dens_max):
                id(iid),
                min_radius(r_min),  max_radius(r_max),
                min_alpha(a_min),   max_alpha(a_max),
                min_density(dens_min), max_density(dens_max)  {}

    template <typename TFloat2>
    ParticleKind(ParticleKind<TFloat2> &pk):
        id(0) {
        operator =<TFloat2>(pk);
    }

    template <typename TFloat2>
    const ParticleKind& operator=(const ParticleKind<TFloat2> &pk) {
        id = pk.id;
        return *this;
    }

    template <typename TFloat2>
    bool operator==(ParticleKind<TFloat2> pk) {
        return id == pk.id;
    }

    static ParticleKind<TFloat> null_kind() {
        return ParticleKind<TFloat>();
    }

    uint id;

    TFloat min_radius, max_radius, min_alpha, max_alpha,
        min_density, max_density;

    void setMinRadius(const TFloat value){
        min_radius = value;
    }
    void setMaxRadius(const TFloat value){
        max_radius = value;
    }
    void setMinAlpha(const TFloat value){
        min_alpha = value;
    }
    void setMaxAlpha(const TFloat value){
        max_alpha = value;
    }
    void setMinDensity(const TFloat value){
        min_density = value;
    }
    void setMaxDensity(const TFloat value){
        max_density = value;
    }
};

Желаю написать редактор набора экземпляров такого типа в отдельном диалоге. Создаю диалог
class CEditParticleSortDialog : public QDialog
{
    Q_OBJECT

public:
    explicit CEditParticleSortDialog(QWidget *parent = 0);
    ~CEditParticleSortDialog();

private:
    Ui::CEditParticleSortDialog *ui;
    CSortsTableModel* model;
};

В котором содержится модель CSortsTableModel
class CSortsTableModel : public QAbstractTableModel
{
    Q_OBJECT
public:
    explicit CSortsTableModel(QObject *parent = 0);
    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) const;
    QVariant headerData(int section,Qt::Orientation orientation, int role=Qt::DisplayRole) const;
    Qt::ItemFlags flags(const QModelIndex &index) const;
signals:
private:
    QList< ParticleKind<float> > kinds;
};


Соответственно, устанавливаю эту модель
CEditParticleSortDialog::CEditParticleSortDialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::CEditParticleSortDialog),
    model(new CSortsTableModel)

{
    ui->setupUi(this);
    ui->tableSorts->setModel(model);
    ui->tableSorts->setItemDelegate( new CParticleKindDelegate(this) );
}


В ui->tableSorts->setModel(model); SIGSEGV

Гуление и изучение документиации не помогло. Перепробовал множество вариантов безрезультатно.
Вопрос: в чём причина возникновения ошибки? Как её устранить?
Подробности при обсуждении.
lanz
Сбой сегментации обычно бывает при использовании неинициализированной памяти. Указателя на удаленный объект, неинициализированного указатля и т.п.
Устранить ее можно найдя, где происходит нарушение.

Для этого можно посмотреть полный стек.
В том коде что вы привели, все выглядит нормально. Скорее всего ошибка в другом месте. Выложите проект, либо минимальный проект который иллюстрирует ошибку.
avkushnarenko
Цитата(lanz @ 17.10.2014, 2:59) *
Сбой сегментации обычно бывает при использовании неинициализированной памяти. Указателя на удаленный объект, неинициализированного указатля и т.п.
Устранить ее можно найдя, где происходит нарушение.

Для этого можно посмотреть полный стек.
В том коде что вы привели, все выглядит нормально. Скорее всего ошибка в другом месте. Выложите проект, либо минимальный проект который иллюстрирует ошибку.


Я нашёл проблему и устранил. Сейчас работает нормально. Сначала я пошёл тем способом, который вы указали, но безрезультатно. Отключая методы один за другим, я выяснил, что
QVariant headerData(int section,Qt::Orientation orientation, int role=Qt::DisplayRole) const;

не должен быть пустым ни при каких обстоятельствах и хотя бы возвращать
return QVariant();
lanz
Полезно читать ворнинги :lol:
avkushnarenko
Цитата(lanz @ 18.10.2014, 2:35) *
Полезно читать ворнинги :lol:

Безусловно полезно, но я использую alglib, который генерирует предупреждения числом в 400 с гаком. Это сыграло со мной злую шутку.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.