Q:

¿Cómo insertar un nodo de una lista mediante una QTableView?

Tengo una lista enlazada que represento mediante una QTableView. ¿Cómo hacer para insertar un nodo en medio de la lista?
Hasta ahora lo estoy haciendo mediante lo que entiendo que es un artificio. Inserto un nodo sin información de forma que ya tengo una línea en blanco. Luego edito la línea para darle el contenido que quiero a ese nodo en blanco. Sin embargo esto me ocasiona otros problemas, como el hecho de tener que borrar ese nodo cuando cierro o cambio la vista.
Mirando en internet, he visto soluciones basadas en añadir una línea más que elementos haya que mostrar, y rellenarla con QVariant() y otras basadas en el uso de un QAbstractProxyModel, pero no sé si hay alguna solución mejor o cual de ellas, sería la más idónea para mi caso.
Aclaro mejor lo que deseo hacer:
Básicamente se trata de permitir que en cualquier punto de la tabla y mediante la pulsación de una tecla u orden con el botón derecho del ratón se me inserte una línea vacía, pero sin tener que modificar la fuente de datos. (ahora lo hago insertando un nodo vacío). Entonces, solamente si relleno la primera celda de la fila vacía, donde hay un campo Id, el nodo quedaría creado e insertado en su posición, modificando la fuente de datos, pero si finalmente no se hace nada o se rellenan celdas de la tabla que no son la primera, el nodo no se consideraría y no habría efectos.
Como la tabla es algo más compleja y a golpe de click se pasa a otra zona de la misma, quiero evitar que si finalmente la línea no es editada correctamente (no está rellenado el campo Id) y por tanto, no hay una inserción efectiva del nodo, no tenga que estar borrando ese nodo vacío "auxiliar".

A:

Bueno, finalmente he hecho un ejemplo sencillo de lo que pretendo que parece funcionar.
Al modelo le añado dos variables:
int lineavacia;
bool haylineavacia;

Estas variables me sirven para saber si tengo una fila vacía en la tabla y su posición.
Cuando empiezo, por ejemplo, pongo esto en el constructor del modelo:
lineavacia = 0;
haylineavacia = true;

De forma que aunque mi lista enlazada está vacía, tengo una fila para poder empezar a introducir datos.
La variable haylineavacia modifican el comportamiento de rowCount()
int MiModel::rowCount(const QModelIndex &parent) const
{
    Q_UNUSED(parent);
    int numlineas;
    if (MiLista.isEmpty())
    {
        numlineas=0;
    }
    else
    {
        numlineas = MiLista.size();
    }
    if (haylineavacia)
    {
        return numlineas+1;
    }
    else
    {
        return numlineas;
    }

De forma que la tabla me muestra una línea más que los nodos de la lista.
Ahora, para mostrar los datos, he de tener en cuenta tanto la variable haylineavacia como lineavacia
 if (role == Qt::DisplayRole || role == Qt::EditRole)
        {
            if (haylineavacia)
            {
                if (index.row()<lineavacia)
                {
                    return MiLista.at(index.row()).LeeNombre();
                }
                else if (index.row()==lineavacia)
                {
                    return QVariant();
                }
                else
                {
                    return MiLista.at(index.row()-1).LeeNombre();
                }
            }
            else
            {
                return MiLista.at(index.row()).LeeNombre();
            }
        }

Simplemente le estoy diciendo que si hay una línea vacía, cuando el index sea menor que la posición de dicha línea vacía, retorne los datos tal cual (la posición de la fila coincide con la del nodo). Cuando el index sea la fila vacía me retorne un QVariant(), de forma que se quede en blanco esa línea, y para las posteriores, he de tener en cuenta que cada fila de la tabla le corresponde un nodo una unidad menor que la posición de dicha fila. (Para la fila 5 le correspondería el nodo 4, por ejemplo. Sólo está permitido insertar una fila vacía). Si no hay linea vacía simplemente retorna cada nodo coincidiendo con su posición en la tabla.
La función insertRows() quedaría como sigue:
bool MiModel::insertRows(int row, int count, const QModelIndex &parent)
{
    Q_UNUSED(parent);
    beginInsertRows(QModelIndex(), row, row+count-1);
    for(int i=0; i<count; i++)
    {
        //MiLista.insert(row+1,Lista());<--antigua forma de hacerlo
        haylineavacia=true;
        lineavacia = row;        
    }
    endInsertRows();   
    return true;
}

Y por último, si añado un dato en la fila vacía, se crea el nodo en la fuente de datos:
if (index.column() ==0 && index.row()==lineavacia && haylineavacia)
    {
        qDebug()<<"Creando nuevo nodo";
        MiLista.insert(index.row(),Lista());//ahora es cuando crea el nuevo nodo para acto seguido editar el campo Id y darle el nombre
        haylineavacia=false;
    }

Al terminar de crear el nodo esa línea ya no está vacía por lo que la variable haylineavacia pasará a false.
Bueno, a falta de controlar algunos detalles, de esta forma funcionaría la tabla tal y como deseo.

