// Copyright (C) 2025 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only #include "randomModel.h" #include #include #include RandomModel::RandomModel(QObject *parent) : QAbstractTableModel(parent) { m_columnCount = 2; m_rowCount = 0; } int RandomModel::rowCount(const QModelIndex &parent) const { Q_UNUSED(parent) return m_data[m_currentCache].count(); } void RandomModel::setRowCount(int rowCount) { if (m_rowCount == rowCount) return; m_rowCount = rowCount; emit rowCountChanged(rowCount); generateCaches(); } int RandomModel::columnCount(const QModelIndex &parent) const { Q_UNUSED(parent) return m_columnCount; } QVariant RandomModel::headerData(int section, Qt::Orientation orientation, int role) const { if (role != Qt::DisplayRole) return QVariant(); if (orientation != Qt::Horizontal) return section == 0 ? "X" : "Y"; return QVariant(); } QVariant RandomModel::data(const QModelIndex &index, int role) const { if (!index.isValid()) return QVariant(); auto data = m_data[m_currentCache]; switch (role) { case Qt::DisplayRole: return data[index.row()].at(index.column()); case XRole: return data[index.row()].at(0); case YRole: return data[index.row()].at(1); default: return QVariant(); } } bool RandomModel::setData(const QModelIndex &index, const QVariant &value, int role) { if (index.isValid() && role == Qt::EditRole) { for (auto data : m_data) data[index.row()].replace(index.column(), value.toReal()); Q_EMIT dataChanged(index, index); return true; } return false; } Qt::ItemFlags RandomModel::flags(const QModelIndex &index) const { return QAbstractItemModel::flags(index) | Qt::ItemIsEditable; } QHash RandomModel::roleNames() const { QHash roles = QAbstractItemModel::roleNames(); roles[Roles::XRole] = "xData"; roles[Roles::YRole] = "yData"; return roles; } void RandomModel::nextCache() { beginResetModel(); m_currentCache = (m_currentCache + 1) % 60; endResetModel(); } void RandomModel::generateCaches() { beginResetModel(); m_data.clear(); m_data.resize(m_cacheCount); for (int i = 0; i < m_cacheCount; i++) { QList> &array = m_data[i]; array.reserve(m_rowCount); for (int j = 0; j < m_rowCount; j++) { qreal y = float(QRandomGenerator::global()->bounded(100)) / (100.0); auto dataList = QList{qreal(j), y}; array.append(dataList); } } endResetModel(); } void RandomModel::clearData() { for (auto data : m_data) { for (auto l : data) l.clear(); data.clear(); } m_data.clear(); }