Qt: QAbstractItemModel работает медленно, если я бросаю сигнал layoutChanged(). В чем проблема?

Я унаследовался от QAbstractItemModel и использую эту модель в TableView в QML.
Я пытаюсь удалить элемент:

bool DownloadListModel::removeDownloadById(const QString &id)
{
    DownloadFile* download = getDownloadById(id);
    int index = getDownloadIndex(download);
    if (download) {
        beginRemoveRows(QModelIndex(),index,index);

        _downloadsList.removeOne(download);
        _downloadsMap.remove(id);
        download->deleteLater();

        _db->deleteDownload(id);

        endRemoveRows();

        return true;
    }
    return false;
}


Это работает, но есть одно но: когда я выбираю в таблице элемент, подсвечивается другой элемент (если удален один, то будет подсвечен элемент непосредственно над выбранным). Поэтому я пытаюсь послать сигнал layoutChanged():

bool DownloadListModel::removeDownloadById(const QString &id)
{
    DownloadFile* download = getDownloadById(id);
    int index = getDownloadIndex(download);
    if (download) {
        emit layoutAboutToBeChanged();
        beginRemoveRows(QModelIndex(),index,index);

        _downloadsList.removeOne(download);
        _downloadsMap.remove(id);
        download->deleteLater();

        _db->deleteDownload(id);

        endRemoveRows();
        emit layoutChanged();

        return true;
    }
    return false;
}


Теперь оно работает правильно, но медленно. В чем проблема? Как это делать правильно?
  • Вопрос задан
  • 3497 просмотров
Пригласить эксперта
Ответы на вопрос 1
@xseven
Сложно сказать, что работает медленно не видя всего кода.
Для начала я бы посоветовал пройтись профилировщиком + дать ссылку на код если возможно.

Вообще несколько странный подход на мой взгляд.
Почему не используется removeRows/removeColumns и их антагонисты insert?
Если так хочется removeById почему не вывести это в виде адаптора?
Несколько проще на мой взгляд по максимуму использовать возможности интерфейса стандартной модели.
Плюс как вычисляется индекс и где сигналы dataChanged? Вы видимо поэтому используете посылку сигналов для layout. Т.к. без посылки dataChanged не стоит надеяться на правильное отображение или выделение.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы