Добрый день.
Хочу запретить добавлять одинаковые данные в таблицу. Делаю следующим образом (class MyModel : public QAbstractTableModel):
bool MyModel::setData( const QModelIndex &index, const QVariant &value, int role )
{
bool result = false;
...
// Get item by given index
MyItem *myItem = getMyItem( index.row() );
...
switch ( index.cloumn() )
{
case 0: // Text field
// Test if my model already has the same data
result = findItem( value.toString() ) != -1;
if ( result ) myItem->setTextField( value.toString() );
break;
...
}
...
if ( result )
emit( dataChanged( index, index );
else
emit ( dataInvalid( index ) );
return result;
}
void MyWindow::dataInvalid( const QModelIndex &index )
{
myTableView->edit( index );
}
edit: edit failed
1. А тебя не смущает то, что result становится равен true, когда найдётся элемент, содержащий value? Я так понимаю, что findItem() возвращает -1, когда ни у одного элемента не найдётся value - случай, когда надо разрешить установку нового значения, то есть:
result = findItem( value.toString() ) == -1;
2. На всякий случай проверяй валидность индекса if(index.isValue()), а то налетишь на кучу неприятностей.
3.
emit( dataChanged( index, index );
...
emit ( dataInvalid( index ) );
Для emit не нужно скобок .
А без этого сигнала редактирование прекращается? Возможно, делегат, отвечающий за редактирование элемента, ещё не отработал до конца, а ты его снова пинаешь.
result = findItem( value.toString() ) == -1;
emit( dataChanged( index, index );
...
emit ( dataInvalid( index ) );
void MyWindow::MyWindow()
{
...
connect( myModel, SIGNAL( dataInvalid( QModelIndex ) ), this, SLOT( dataInvalid( QModelIndex ) ), Qt::QueuedConnection );
....
}
Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)