Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ Qt Модель/Представление _ добавление данных в CustomTableModel

Автор: korel 18.5.2010, 11:56

создал CustomTableModel: public QAbstractTableModel и для того, чтобы добавлять в нее данные использую QList<QStringList> list, к тому же переопределил rowCount(), columnCount(), setData(), data().
Проблема собственно в том, что заранее я не знаю размера lista, потому, что он наполняется по мере считывания данных с файла.

вот куски кода - класс CustomTableModel, метод записи в модель, и метод считывания данных с файла:

class CustomTableModel : public QAbstractTableModel
{
    Q_OBJECT

    QList<QStringList> fileDataList;

public:
    CustomTableModel(QObject *parent = NULL);//done

    int rowCount(const QModelIndex &parent = QModelIndex()) const
    {
        return fileDataList.size();
    }

    int columnCount(const QModelIndex &parent = QModelIndex()) const
    {
        if(!fileDataList.isEmpty())
            return fileDataList.at(0).size();
        return -1;
    }

    QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const
    {
        if(!index.isValid())
            return QVariant();
        if(index.row() >= fileDataList.size() || index.row() < 0)
            return QVariant();
        if(role == Qt::DisplayRole || role == Qt::EditRole)
            return fileDataList.at(index.row()).at(index.column());
        else
            return QVariant();
    }

    bool setData(const QModelIndex &index, const QVariant &value, int role)
    {
        if(index.isValid() && role == Qt::EditRole)
        {
            fileDataList[index.row()].replace(index.column(), value.toString());
            emit dataChanged(index, index);
            return true;
        }
        return false;
    }

    bool insertRows(int row, int count, const QModelIndex &parent)
    {
        beginInsertRows(QModelIndex(), row, row + count);

        endInsertRows();
    }
};

void Reader::readFile(const QString &path)
{
    QFile file(path);
    if(file.open(QIODevice::ReadOnly))
    {
        while(!file.atEnd())
        {
            QString str(file.readLine());
            QStringList strList(str.split(" ", QString::SkipEmptyParts));
            emit fileData(strList);
        }
        file.close();
    }
}

void MainWindow::setFileData(QStringList &strList)
{
    QStringList list = strList;
    qDebug()<<"new QStringList:\n";
    qDebug()<<"row insert flag: " << pModel->insertRow(rCount, QModelIndex());
    qDebug()<<"columns insert flag: " <<pModel->insertColumns(0, list.size(), QModelIndex());
    for(int i=0;i<list.size();++i)
    {
        qDebug()<<"column insert flag: " << pModel->insertColumn(i, QModelIndex());
        pModel->setData(pModel->index(rCount, i, QModelIndex()), "123", Qt::EditRole);
        qDebug()<<"QVariant: " << pModel->data(pModel->index(rCount, i, QModelIndex()), Qt::DisplayRole).toString();
    }
    qDebug()<<"\n";
    ++rCount;
}

Автор: azure 18.5.2010, 15:24

Я НЕ понял, в чем суть проблемы. Ну не знаете, и что? Наполняйте пока не кончится. Цикл while как раз для этого и придуман.

Автор: Litkevich Yuriy 18.5.2010, 15:28

Цитата(Гость_korel_* @ 18.5.2010, 15:56) *
Проблема собственно в том, что заранее я не знаю размера lista,
Почитай "http://doc.crossplatform.ru/qt/4.5.0/model-view-model-subclassing.html#lazy-population-of-model-data"
Также посмотри реализацию QSqlQueryModel, т.к. БД не отдаёт всю информацию разом, а выдаёт её построчно, т.к. информации может быть слишком много. Эта модель читает информацию по мере того, как представление её запрашивает

Цитата(azure @ 18.5.2010, 19:24) *
Наполняйте пока не кончится.
программа задумчивая получится - плохо

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)