Russian Qt Forum

Qt => Вопросы новичков => Тема начата: 4sgen от Сентябрь 03, 2020, 14:24



Название: Обновление модели
Отправлено: 4sgen от Сентябрь 03, 2020, 14:24
Здравствуйте.
Есть модель QAbstractTableModel
почему-то  не обновляет модель при изменении данных.
Если изменить размер родительского окна, то начинает обновлять
Пробовал
Model->dataChanged(index(0, 0), index(1, 1));
QMainwindow::update()
QMainwindow::repaint()



Название: Re: Обновление модели
Отправлено: Пантер от Сентябрь 03, 2020, 17:43
Покажи больше кода, непонятно что и как ты делаешь. такое ощущение, что ты пытаешься дернуть сигнал модели снаружи, а тебе нужно эмитить сигнал из модели после изменения данных. В общем, давай код модели.


Название: Re: Обновление модели
Отправлено: 4sgen от Сентябрь 04, 2020, 05:00
Покажи больше кода, непонятно что и как ты делаешь. такое ощущение, что ты пытаешься дернуть сигнал модели снаружи, а тебе нужно эмитить сигнал из модели после изменения данных. В общем, давай код модели.

Код:
#ifndef PARAMETERSMODEL_H
#define PARAMETERSMODEL_H

#include <QAbstractTableModel>

class ParametersModel : public QAbstractTableModel
{
    Q_OBJECT

public:

    explicit ParametersModel(QObject *parent = nullptr);

    void populateData(const QList<QString> &Measurment, const QList<QString> &Unit, const QList<QString> &Current);

    int rowCount(const QModelIndex &parent = QModelIndex()) const Q_DECL_OVERRIDE;
    int columnCount(const QModelIndex &parent = QModelIndex()) const Q_DECL_OVERRIDE;

    QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const Q_DECL_OVERRIDE;
    QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const Q_DECL_OVERRIDE;

private:
    QList<QString> m_Measurment;
    QList<QString> m_Unit;
    QList<QString> m_Current;
};

#endif // PARAMETERSMODEL_H


Код:
#include "parametersmodel.h"

ParametersModel::ParametersModel(QObject *parent)
    : QAbstractTableModel(parent)

{   
}

void ParametersModel::populateData(const QList<QString> &Measurment, const QList<QString> &Unit, const QList<QString> &Current)
{
    m_Measurment.clear();
    m_Measurment = Measurment;
    m_Unit.clear();
    m_Unit = Unit;
    m_Current.clear();
    m_Current = Current;
    emit dataChanged(index(0, 0), index(rowCount(), columnCount()));
    return;
}

int ParametersModel::rowCount(const QModelIndex &parent) const
{
    Q_UNUSED(parent);
    return m_Measurment.length();
}

int ParametersModel::columnCount(const QModelIndex &parent) const
{
    Q_UNUSED(parent);
    return 3;
}

QVariant ParametersModel::data(const QModelIndex &index, int role) const
{
    if (!index.isValid() || role != Qt::DisplayRole) {
        return QVariant();
    }
    if (index.column() == 0) {
        return m_Measurment[index.row()];
    } else if (index.column() == 1) {
        return m_Unit[index.row()];
    } else if (index.column() == 2) {
        return m_Current[index.row()];
    }
    return QVariant();
}

QVariant ParametersModel::headerData(int section, Qt::Orientation orientation, int role) const
{
    if (role == Qt::DisplayRole && orientation == Qt::Horizontal) {
            if (section == 0) {
                return QString("Измерение");
            } else if (section == 1) {
                return QString("ед. изм.");
            } else if (section == 2) {
                return QString("Текущее значение");
            }
        }
        return QVariant();
}

при изменении данных вызываю
Код:
paramModel->populateData(Measurment, Unit, Current);


Название: Re: Обновление модели
Отправлено: 4sgen от Сентябрь 04, 2020, 05:14
Причем метод
Код:
ParametersModel::data
начинает вызываться только после изменения размера формы.


Название: Re: Обновление модели
Отправлено: 4sgen от Сентябрь 04, 2020, 05:30
Кстати, заметил еще одну вещь - если вызвать метод загрузки данных в конструкторе, то все работает. Если позже - нет.

Код:
void MainWindow::updateTable()
{
    QList<QString> Measurment;
    QList<QString> Unit;
    QList<QString> Current;

    Measurment.append("X");
    Unit.append("X");
    Current.append(QString::number(X, 'f', 3));

    Measurment.append("Y");
    Unit.append("Y");
    Current.append(QString::number(Y, 'f', 3));

    Measurment.append("Z");
    Unit.append("Z");
    Current.append(QString::number(Z, 'f', 3));

    paramModel->populateData(Measurment, Unit, Current);
}

Пока так и оставил. НО это кажется не правильным решением. Где-то на форуме писали

Цитировать
А, кажется понял.
Если добавляем ряды после конструктора, надо обрамлять это дело beginInsertRows/endInsertRows. Там отстреляются нужные события.


Название: Re: Обновление модели
Отправлено: Пантер от Сентябрь 04, 2020, 07:40
Да, тебе обязательно надо вызывать beginInsertRows/endInsertRows или beginRemoveRows/endRemoveRows