PDA

View Full Version : after inserting row in qTableView the button in the next row disappears



wulingren
27th September 2012, 19:53
I used QTableView with QAbstractItemModel. I started with a table with only one row which has a "Add" button (I added it by setIndexWidget)
When clicking this button I add a new blank row. If the new row is inserted below it's fine, however if inserted above then the "Add" button in the old row disappears. However I wanted to insert above so the row with the "add" button is always at the bottom. Appreciate any input.

The calls I reimplemented:



QVariant VarTableModel::data(const QModelIndex & index, int role) const
{
QVariant var;

if(index.isValid())
{

if(role == Qt::DisplayRole)
{
// the last row is just the "Add" button, no data
if((index.column() == 2) && (index.row() != rowCount()-1))
{
int idx = getDesignVarIndexFromRow(index.row());
if(idx >= 0)
{
Variable desVar = designVariables.at(idx);
QString exp;
createVarExpFromStruct(desVar, exp);
var.setValue(exp);
}
}
}
else if(role == Qt::CheckStateRole)
{
if((index.column() == 1) && (index.row() != rowCount()-1))
{
enum Qt::CheckState flags;

int idx = getDesignVarIndexFromRow(index.row());
if(idx >= 0)
{
Variable desVar = designVariables.at(idx);
if(desVar.enabled)
{
flags = Qt::Checked;
}
else
{
flags = Qt::Unchecked;
}
}
else
{
flags = Qt::Checked;
}
return flags;
}
}
}
return var;
}

//----------------------------------------------------------------------------
bool VarTableModel::setData(const QModelIndex& index, const QVariant& value, int role)
{
if(role == Qt::CheckStateRole)
{
int idx = getDesignVarIndexFromRow(index.row());
if(idx >= 0)
{
Variable desVar = designVariables.at(idx);

if(value == Qt::Checked)
{
desVar.enabled = true;
}
else
{
desVar.enabled = false;
}
}
}
emit dataChanged(index, index);
return true;
}


Qt::ItemFlags VarTableModel::flags ( const QModelIndex & index ) const
{
if(index.column() == 1)
{
if(index.row() != rowCount()-1)
{
return Qt::ItemIsSelectable | Qt::ItemIsUserCheckable | Qt::ItemIsEnabled | Qt::ItemIsEditable;
}
else // last row with "Add" button
{
return Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsEditable;
}
}
else
{
return QAbstractItemModel::flags(index);
}
}

//----------------------------------------------------------------------------
bool VarTableModel::insertRow(int row, const QModelIndex & parent)
{
beginInsertRows(QModelIndex(), row, row);
endInsertRows();
return true;
}