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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Обновление модели  (Прочитано 3303 раз)
4sgen
Новичок

Offline Offline

Сообщений: 27


Просмотр профиля
« : Сентябрь 03, 2020, 14:24 »

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

Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #1 : Сентябрь 03, 2020, 17:43 »

Покажи больше кода, непонятно что и как ты делаешь. такое ощущение, что ты пытаешься дернуть сигнал модели снаружи, а тебе нужно эмитить сигнал из модели после изменения данных. В общем, давай код модели.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
4sgen
Новичок

Offline Offline

Сообщений: 27


Просмотр профиля
« Ответ #2 : Сентябрь 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);
Записан
4sgen
Новичок

Offline Offline

Сообщений: 27


Просмотр профиля
« Ответ #3 : Сентябрь 04, 2020, 05:14 »

Причем метод
Код:
ParametersModel::data
начинает вызываться только после изменения размера формы.
Записан
4sgen
Новичок

Offline Offline

Сообщений: 27


Просмотр профиля
« Ответ #4 : Сентябрь 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. Там отстреляются нужные события.
« Последнее редактирование: Сентябрь 04, 2020, 05:43 от 4sgen » Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #5 : Сентябрь 04, 2020, 07:40 »

Да, тебе обязательно надо вызывать beginInsertRows/endInsertRows или beginRemoveRows/endRemoveRows
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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