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
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
pau
  опции профиля:
сообщение 29.11.2013, 12:20
Сообщение #3


Новичок


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

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




Репутация:   0  


Цитата(Анна @ 29.11.2013, 10:52) *
1. А тебя не смущает то, что result становится равен true, когда найдётся элемент, содержащий value? Я так понимаю, что findItem() возвращает -1, когда ни у одного элемента не найдётся value - случай, когда надо разрешить установку нового значения, то есть:
result = findItem( value.toString() ) == -1;

согласен. у меня просто немного сложнее сделано, когда переносил забыл поправить :)

Цитата(Анна @ 29.11.2013, 10:52) *
2. На всякий случай проверяй валидность индекса if(index.isValue()), а то налетишь на кучу неприятностей.

естессно - там где точечки стоят, там и проверяю :)

Цитата(Анна @ 29.11.2013, 10:52) *
3.
emit( dataChanged( index, index );
...
emit ( dataInvalid( index ) );

Для emit не нужно скобок .

вроде бы можно и так - мне лично так как-то приятнее

Цитата(Анна @ 29.11.2013, 10:52) *
А без этого сигнала редактирование прекращается? Возможно, делегат, отвечающий за редактирование элемента, ещё не отработал до конца, а ты его снова пинаешь.

действительно - дело в том, что на момент вызова QTableView находится еще в режиме редактирования. Так что надо просто добавить Qt::QueuedConnection при соединении с соответствующим сигналом:
void MyWindow::MyWindow()
{
    ...
    connect( myModel, SIGNAL( dataInvalid( QModelIndex ) ), this, SLOT( dataInvalid( QModelIndex ) ), Qt::QueuedConnection );
    ....
}

Все работает! Большое спасибо!

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 29.11.2013, 13:35
Сообщение #4


фрилансер
******

Группа: Участник
Сообщений: 2941
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

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




Репутация:   34  


Цитата(pau @ 28.11.2013, 21:00) *
Может быть есть какой-нибудь другой способ запретить добавлять одинаковые данные в таблицу?

конечно есть - ассоциативный массив с уникальным ключом :) В такой массив в принципе невозможно записать два одинаковых ключа
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 25.11.2024, 22:01