Вставка QAbstactTableModel вверху

У меня есть функция addFile в моем классе TableModel, которая вставляет новую запись в конце.

void TableModel::addFile(const QString &path)
{
    beginInsertRows(QModelIndex(), list.size(),list.size());
    TableItem item;
    item.filename = path;
    QFile file(path);
    item.size = file.size();
    item.status = StatusNew;
    list << item;
    endInsertRows();
}

Эта функция работает нормально, но вместо добавления записи в конце я хотел бы вставить ее сверху. Любые указатели о том, как обновить мою существующую функцию?

Я уже попробовал несколько комбинаций, но удачи нет.

3 ответа

Решение

Спасибо всем за ответ. Я нашел решение самостоятельно:

Если кому-то интересно

void TableModel::addFile(const QString &path)
{
    beginInsertRows(QModelIndex(), list.size(), list.size());
    TableItem item;
    item.filename = path;
    QFile file(path);
    item.size = file.size();
    item.status = StatusNew;
    list << item; // Why Assign first? Maybe not required
    for (int i = list.size() - 1; i > 0; i--)
    {
        list[i] = list[i-1];
    }
    list[0] = item; // set newly added item at the top
    endInsertRows();
}

Есть две вещи, которые вам нужно сделать. Сначала нужно настроить вызов beginInsertRows. Потому что именно здесь мы говорим модели, что мы добавляем строки, куда они пойдут и сколько мы добавляем. Вот описание метода:

void QAbstractItemModel:: beginInsertRows (const QModelIndex & parent, int first, int last)

Так что в вашем случае, так как вы хотите добавить строку с первым индексом и только одну строку, мы передаем 0 в качестве индекса первого элемента и 0, который является индексом последнего элемента, который мы добавляем (потому что, конечно, мы добавляем только один элемент).

beginInsertRows(modelIndex(), 0, 0);

Далее мы должны предоставить данные для элемента. Я предполагаю, что "список" является QList (если нет, то, вероятно, похож). Поэтому мы хотим вызвать метод insert.

list.insert(0, item);

И это должно быть так.

Для отображения вы можете попробовать делегатов, как объяснено в ссылке (хотя я не пробовал пример). Это поможет сообществу, если вы можете добавить свои наблюдения.

Другие вопросы по тегам