@Mercury13
Программист на «си с крестами» и не только

QAbstractTableModel: почему доступна только одна строчка и остальные серые?

У нас есть QSqlQueryModel, которая (надеюсь) работает столь же надёжно, как и БД-компонеты Delphi. А мне надо добавить к ней одну «левую» строчку. Пишу вот такую дрянь (slave — это та самая QSqlQueryModel).

Всё работает, только все строчки, кроме этой самой новой, серые. Что я недописал?

Смысл. На новой строчке row=0, column=*, internal=this.
На старых — соответствуют старой таблице.

QModelIndex FmDbImportDialog::InteractivePreviewModel::index(
        int row, int column, const QModelIndex &parent) const
{
    if (row <= 0) {
        return createIndex(0, column, const_cast<InteractivePreviewModel*>(this));
    } else {
        return slave.index(row - 1, column, parent);
    }
}

int FmDbImportDialog::InteractivePreviewModel::rowCount(
        const QModelIndex &parent) const
{
    return slave.rowCount(parent) + 1;
}

int FmDbImportDialog::InteractivePreviewModel::columnCount(
        const QModelIndex &parent) const
{
    return slave.columnCount(parent);
}


QVariant FmDbImportDialog::InteractivePreviewModel::data(
        const QModelIndex &index, int role) const
{
    if (index.internalPointer() == this) {
        switch (role) {
        case Qt::DisplayRole:
            return QString("Test");
        default:
            return QVariant();
        }
    } else {
        return slave.data(index, role);
    }
}

QVariant FmDbImportDialog::InteractivePreviewModel::headerData(
        int section, Qt::Orientation orientation, int role) const
{
    if (orientation != Qt::Vertical) {
        return slave.headerData(section, orientation, role);
    } else if (section == 0) {
        return QVariant();
    } else {
        return slave.headerData(section - 1, Qt::Vertical, role);
    }
}


Попробовал также унаследоваться от QSqlQueryModel. Вообще цирк: выделение ведёт себя непредсказуемо.

P.S. Сработало, когда я сделал сплошную нумерацию строк и data() строит новый индекс, уменьшая строку на 1. Надёжно ли работает с БД — не знаю; БД — штука тонкая. Но всё равно объясните, как оно работает с индексами…
  • Вопрос задан
  • 258 просмотров
Решения вопроса 1
@Mercury13 Автор вопроса
Программист на «си с крестами» и не только
Моё решение.
У QModelIndex есть ссылка на модель! Поэтому…

1. index должен создавать СВОЙ индекс.
return slave.index(row - 1, column, parent);
Неверно, надо создавать свой индекс. И вообще, если модель табличная, index будет тривиальным и его можно взять у QAbstractTableModel.

2. А вот data — именно data, а не index — должен просить slave создать новый индекс.
return slave.data(index, role);
Неверно, пусть сначала slave преобразует координаты в свой индекс, а затем обратимся с этим индексом к его data.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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