代码改变世界

Fetch More Example

2021-04-08 11:48  清晨、午后  阅读(118)  评论(0编辑  收藏  举报

 

TestModel.h
class TestModel : public QAbstractItemModel
{
    Q_OBJECT

public:

    enum Columns {Number, Group, Sn, DeviceSN, AuthObject, AuthProduct, RecoveryTime, ColumnSize};

    TestModel(QObject *parent = nullptr)
    {
        m_headers << tr("No.") << tr("Group") << tr("Serial Number") << tr("Device SN")
                  << tr("Authorized User") << tr("Product") << tr("Time Restored");
    }
    virtual QModelIndex index(int row, int column, const QModelIndex &parent) const Q_DECL_OVERRIDE;
    virtual QModelIndex parent(const QModelIndex &child) const Q_DECL_OVERRIDE;

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

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

signals:
    void numberPopulated(int number);

public slots:
    void setData(const QList<Data::ActiveInfoPtr> &infosPtr);

protected:
    bool canFetchMore(const QModelIndex &parent) const override;
    void fetchMore(const QModelIndex &parent) override;

private:
    QList<Data::ActiveInfoPtr> m_infosPtr;
    int fileCount;
    QStringList m_headers;
};

 

 

TestModel.cpp
void TestModel::setData(const QList<Data::ActiveInfoPtr> &infosPtr)
{
    beginResetModel();
    m_infosPtr = infosPtr;
    fileCount = 0;
    endResetModel();
}

bool TestModel::canFetchMore(const QModelIndex &parent) const
{
    if (parent.isValid())
        return false;
    return (fileCount < m_infosPtr.size());
}

void TestModel::fetchMore(const QModelIndex &parent)
{
    if (parent.isValid())
        return;
    int remainder = m_infosPtr.size() - fileCount;
    int itemsToFetch = qMin(100, remainder);

    if (itemsToFetch <= 0)
        return;

    beginInsertRows(QModelIndex(), fileCount, fileCount + itemsToFetch - 1);

    fileCount += itemsToFetch;

    endInsertRows();

    emit numberPopulated(itemsToFetch);
}

QModelIndex TestModel::index(int row, int column, const QModelIndex &parent) const
{
    Q_UNUSED(parent)

    if (m_infosPtr.empty())
        return QModelIndex();

    if (!m_infosPtr.empty()) {
        ActiveInfoPtr info = m_infosPtr.at(static_cast<size_t>(row));
        if (info.isNull())
            return QModelIndex();

        return createIndex(row, column, info.data());
    }

    return QModelIndex();
}

QModelIndex TestModel::parent(const QModelIndex &child) const
{
    return QModelIndex();
}

int TestModel::rowCount(const QModelIndex &parent) const
{
    return parent.isValid() ? 0 : fileCount;
}

int TestModel::columnCount(const QModelIndex &) const
{
    return Columns::ColumnSize;
}

QVariant TestModel::data(const QModelIndex &index, int role) const
{
    if (!index.isValid())
        return QVariant();

    int row = index.row();
    int column = index.column();

    if (row >= m_infosPtr.size())
        return QVariant();

    switch (role) {
    case Qt::DisplayRole:
        if (column == Columns::Number)
            return m_infosPtr.at(row)->number();

        if (column == Columns::Group)
            return m_infosPtr.at(row)->group();

        if (column == Columns::Sn)
            return Utils::generateXXX(m_infosPtr.at(row)->sn());

        if (column == Columns::DeviceSN)
            return m_infosPtr.at(row)->deviceSn();

        if (column == Columns::AuthProduct)
            return Utils::authObject(m_infosPtr.at(row)->authProduct());

        if (column == Columns::AuthObject)
            return m_infosPtr.at(row)->authObject();

        if (column == Columns::RecoveryTime)
            return Utils::timeStampFormat(m_infosPtr.at(row)->recoveryTime());

        return QVariant();

    default:
        return QVariant();
    }
}

QVariant TestModel::headerData(int section, Qt::Orientation orientation, int role) const
{

    if (Qt::Vertical == orientation)
        return QVariant();

    if (role == Qt::DisplayRole) {
        if (section >= m_headers.size())
            return QVariant();

        return m_headers.at(section);
    }
    return QVariant();

}

 

 

widget 中使用

m_listModel = new TestModel(this);
m_view->setModel(m_listModel);
m_listModel->setData(infosPtr);

 

 

 

-----

setData