Название: Обновление модели Отправлено: 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
|