Может по нажатию на спецклавишу показывать диалог с полями для ввода, кнопкой ОK, кнопкой Cancel и там проверять валидность данных... Если не хочешь добавлять, то Cancel...
Это не всегда "красиво"
Итак нашел решение:
1. При создании объекта делегата в качестве родителя даю объект QTableView
Делегат (только значимые для решения моменты):
C++ (Qt)
class VLineEditDelegate : public QStyledItemDelegate
{
public:
void setEditorData(QWidget *editor, const QModelIndex &index) const;
void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const;
};
void VLineEditDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
{
this->parent()->setObjectName("EDTIN");
...
}
void VLineEditDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
{
this->parent()->setObjectName("");
...
}
Представление (только значимые для решения моменты):
C++ (Qt)
class VTableView : public QTableView
{
Q_OBJECT
protected:
void focusOutEvent(QFocusEvent *e);
void closeEditor ( QWidget * editor, QAbstractItemDelegate::EndEditHint hint);
public:
explicit VTableView(QStandardItemModel *model, QWidget *parent = 0);
void setItemDelegateForColumnSG(int col,QStyledItemDelegate *delegate);
void itemAddCols();
bool dontCheck;
private slots:
void currentRowChanged ( const QModelIndex & current, const QModelIndex & previous );
void checkEmpty(const QModelIndex & itemIndex,bool selfFocusCheck=false);
};
VTableView::VTableView(QStandardItemModel *model, QWidget *parent) :
QTableView(parent)
{
this->dontCheck=true;
}
void VTableView::focusOutEvent(QFocusEvent *e)
{
if (this->objectName()!="EDTIN") this->checkEmpty(this->currentIndex());
QTableView::focusOutEvent(e);
}
void VTableView::currentRowChanged ( const QModelIndex & current, const QModelIndex & previous )
{
if (previous.row()!=current.row())
{
if (previous.row()>=0) this->checkEmpty(previous);
....
}
QTableView::currentChanged (current, previous);
}
void VTableView::setItemDelegateForColumnSG(int col,QStyledItemDelegate *delegate)
{
if (col>=this->model()->columnCount()) return;
delegate->setParent(this);
this->setItemDelegateForColumn(col,delegate);
}
void VTableView::checkEmpty(const QModelIndex & itemIndex,bool selfFocusCheck)
{
if (this->dontCheck) return;
if (selfFocusCheck&&this->hasFocus()) return;
if (!itemIndex.isValid()) return;
if (itemIndex.row()>=0)
{
bool isFull = true;
for (register int i=0;i<this->fields.count();i++)
{
QStandardItemModel *model = dynamic_cast<QStandardItemModel *>(this->model());
isFull = //проверка заполненности
}
if (!isFull) {
this->dontCheck=true;
this->model()->removeRow(itemIndex.row(),itemIndex.parent());
this->dontCheck=false;
}
}
}
void VTableView::itemAddCols()
{
this->dontCheck=true;
QList<QStandardItem *> row;
QStandardItemModel * model = qobject_cast<QStandardItemModel *>(this->model());
for(register int i=0;i<model->columnCount();++i)
{
QStandardItem *field = new QStandardItem("");
field->setEditable(true);
row.append(field);
}
model->appendRow(row);
this->dontCheck=false;
}
void VTableView::closeEditor ( QWidget * editor, QAbstractItemDelegate::EndEditHint hint)
{
this->checkEmpty(this->currentIndex(),true);
this->setObjectName("");
QTableView::closeEditor(editor,hint);
}