从逗号分隔的文本文件创建自定义QAbstractItemModel

时间:2017-11-30 09:43:44

标签: qt model-view-controller qtableview qabstractitemmodel

我有这个问题,在插入100.000行并特别使用多个选择后,我的Qtableview变得非常缓慢。

因此在经过一些研究之后,我决定使用自己的继承自QAbstractItemModel的模型。但问题是我不知道如何使用它,因为文本文件可以改变。 FX。我可以加载一个包含5列和50.000行的文件,一段时间后它可以有15列和10.000行。 数据不需要更改,因此它只能读取。 有人可以帮我解决这个问题吗?

我的"空"自定义模型在这里

#include "customabstractmodel.h"

CustomAbstractModel::CustomAbstractModel(QObject *parent)
    : QAbstractItemModel(parent)
{
}

QVariant CustomAbstractModel::headerData(int section, Qt::Orientation orientation, int role) const
{
    // FIXME: Implement me!
}

bool CustomAbstractModel::setHeaderData(int section, Qt::Orientation orientation, const QVariant &value, int role)
{
    if (value != headerData(section, orientation, role)) {
        // FIXME: Implement me!
        emit headerDataChanged(orientation, section, section);
        return true;
    }
    return false;
}

QModelIndex CustomAbstractModel::index(int row, int column, const QModelIndex &parent) const
{
    // FIXME: Implement me!
}

QModelIndex CustomAbstractModel::parent(const QModelIndex &index) const
{
    // FIXME: Implement me!
}

int CustomAbstractModel::rowCount(const QModelIndex &parent) const
{
    if (!parent.isValid())
        return 0;

    // FIXME: Implement me!
}

int CustomAbstractModel::columnCount(const QModelIndex &parent) const
{
    if (!parent.isValid())
        return 0;

    // FIXME: Implement me!
}

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

    // FIXME: Implement me!
    return QVariant();
}

bool CustomAbstractModel::setData(const QModelIndex &index, const QVariant &value, int role)
{
    if (data(index, role) != value) {
        // FIXME: Implement me!
        emit dataChanged(index, index, QVector<int>() << role);
        return true;
    }
    return false;
}

Qt::ItemFlags CustomAbstractModel::flags(const QModelIndex &index) const
{
    if (!index.isValid())
        return Qt::NoItemFlags;

    return Qt::ItemIsEditable; // FIXME: Implement me!
}

bool CustomAbstractModel::insertRows(int row, int count, const QModelIndex &parent)
{
    beginInsertRows(parent, row, row + count - 1);
    // FIXME: Implement me!
    endInsertRows();
}

bool CustomAbstractModel::insertColumns(int column, int count, const QModelIndex &parent)
{
    beginInsertColumns(parent, column, column + count - 1);
    // FIXME: Implement me!
    endInsertColumns();
}

bool CustomAbstractModel::removeRows(int row, int count, const QModelIndex &parent)
{
    beginRemoveRows(parent, row, row + count - 1);
    // FIXME: Implement me!
    endRemoveRows();
}

bool CustomAbstractModel::removeColumns(int column, int count, const QModelIndex &parent)
{
    beginRemoveColumns(parent, column, column + count - 1);
    // FIXME: Implement me!
    endRemoveColumns();
}

编辑#1 Csv数据(不是真实信息,随机化)

姓名,电话,电子邮件,地址,城市,邮编 Chavez,Lisandra F.,1-498-913-8181,ac.fermentum.vel @ semperrutrumFusce.org,Ap#123-1044 Sed Rd。,Drayton Valley,21833 Humphrey,Briar W.,1-583-466-4027,Morbi.accumsan.laoreet @ Loremipsumdolor.net,Ap#642-6497 Id Rd。,Lochgilphead,16394 Benson,Tasha H.,1-898-918-7872,consequat @ enimEtiam.ca,P.O。方框197,4720 Ipsum。街,德福,56688 Emerson,Susan P.,1-190-818-1919,dignissim @ liberoatauctor.ca,P.O。 Box 482,7813 Dolor。 Ave,San Antonio,M8C 7F6 Dunn,Alexander U.,1-222-379-2231,libero.Donec.consectetuer @nongestasa.ca,803-958 Lectus Rd。,Raleigh,74078

1 个答案:

答案 0 :(得分:0)

假设我们将整个文件读入内存,我将以下列方式实现模型(来自QAbstractTableModel的子类):

CustomAbstractModel::CustomAbstractModel(const QString &filePath,
                                         QObject *parent)
    :
        QAbstractTableModel(parent)
{
    // Parse the file and store its data in an internal data structure
    QFile file(filePath);
    if (file.open(QIODevice::ReadOnly))
    {
        QTextStream in(&file);
        while (!in.atEnd())
        {
            // Assuming that m_data is a std::vector<QString>
            m_data.emplace_back(in.readLine());
        }
    }    
}

QVariant CustomAbstractModel::headerData(int section,
                                         Qt::Orientation orientation,
                                         int role) const
{
    if (orientation == Qt::Horizontal && role == Qt::DisplayRole &&
        !m_data.empty())
    {
        // Read the column names from the first line        
        const QString &firstLine = m_data.front();
        QStringList headers = firstLine.split(',');
        return headers.at(section);
    }    
}

int CustomAbstractModel::rowCount(const QModelIndex &parent) const
{
    if (!m_data.empty())
    {
        return m_data.size() - 1; // First line is the column names data
    }
    return 0;
}

int CustomAbstractModel::columnCount(const QModelIndex &parent) const
{
    if(!m_data.empty())
    {
        const QString &firstLine = m_data.front();
        return firstLine.count(",") + 1;
    }
    return 0;    
}

QVariant CustomAbstractModel::data(const QModelIndex &index, int role) const
{
    if (m_data.empty() && role == Qt::DisplayRole)
    {
        // First line is the header data.
        const QString &line = m_data[index.row() + 1];
        QStringList columnData = firstLine.split(',');
        return columnData.at(index.column());
    }
    return QVariant();    
}