У нас есть 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. Надёжно ли работает с БД — не знаю; БД — штука тонкая. Но всё равно объясните, как оно работает с индексами…