crossplatform.ru

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


  Ответ в QTableView::edit( const QModelIndex index ) не работает
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
 

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
Алексей1153 Дата 29.11.2013, 13:35
 
Цитата(pau @ 28.11.2013, 21:00) *
Может быть есть какой-нибудь другой способ запретить добавлять одинаковые данные в таблицу?

конечно есть - ассоциативный массив с уникальным ключом :) В такой массив в принципе невозможно записать два одинаковых ключа
pau Дата 29.11.2013, 12:20
 
Цитата(Анна @ 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 );
    ....
}

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

Анна Дата 29.11.2013, 9:52
  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 не нужно скобок .

А без этого сигнала редактирование прекращается? Возможно, делегат, отвечающий за редактирование элемента, ещё не отработал до конца, а ты его снова пинаешь.
pau Дата 28.11.2013, 18:00
  Добрый день.
Хочу запретить добавлять одинаковые данные в таблицу. Делаю следующим образом (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


Что я делаю неправильно? Может быть есть какой-нибудь другой способ запретить добавлять одинаковые данные в таблицу?
Заранее большое спасибо за ответы.
Просмотр темы полностью (откроется в новом окне)
RSS Текстовая версия Сейчас: 19.4.2024, 19:00