Revision control
Copy as Markdown
// Copyright (C) 2025 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
#include "randomModel.h"
#include <qabstractitemmodel.h>
#include <qnamespace.h>
#include <QRandomGenerator>
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<int, QByteArray> RandomModel::roleNames() const
{
QHash<int, QByteArray> 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<QList<qreal>> &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>{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();
}