crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

> QTableView::edit( const QModelIndex index ) не работает
pau
  опции профиля:
сообщение 28.11.2013, 18:00
Сообщение #1


Новичок


Группа: Новичок
Сообщений: 6
Регистрация: 28.11.2013
Пользователь №: 3989

Спасибо сказали: 5 раз(а)




Репутация:   0  


Добрый день.
Хочу запретить добавлять одинаковые данные в таблицу. Делаю следующим образом (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;
}

Теперь надо отловить этот сигнал и вернуть ячейку таблицы (QTableView *myTableView) обратно в режим редактирования:

void MyWindow::dataInvalid( const QModelIndex &index )
{
    myTableView->edit( index );
}


Но во время выполнения таблица обратно в режим редактирования не переходит а в консоли я получаю сообщение:

edit: edit failed


Что я делаю неправильно? Может быть есть какой-нибудь другой способ запретить добавлять одинаковые данные в таблицу?
Заранее большое спасибо за ответы.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
Анна
  опции профиля:
сообщение 29.11.2013, 9:52
Сообщение #2


Активный участник
***

Группа: Участник
Сообщений: 276
Регистрация: 22.5.2008
Из: Зеленоград
Пользователь №: 181

Спасибо сказали: 30 раз(а)




Репутация:   4  


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 не нужно скобок .

А без этого сигнала редактирование прекращается? Возможно, делегат, отвечающий за редактирование элемента, ещё не отработал до конца, а ты его снова пинаешь.

Сообщение отредактировал Анна - 29.11.2013, 9:52
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 23.4.2024, 12:03