Russian Qt Forum

Qt => Model-View (MV) => Тема начата: giker от Январь 03, 2011, 11:57



Название: Необычный QTableView
Отправлено: giker от Январь 03, 2011, 11:57
С Новым годом коллеги! Возникла следующая проблема. Сделан грид на основе QTableView. Первая колонка этого грида не редактируема, вторая колонка может радактироваться пользователем, третья представляет из себя комбобокс, причем третья и вторая колонка всегда должны находиться в режиме редактирования, что бы пользователь мог редактировать вторую колонку, и видел что в гриде есть комбобокс в третьей колонке, сразу, а не по щелчку мыши. Все это сделано спомощью вот такого кода
Код:
void Dialog::setupDelegateAndGrid()
{
    if (m_fields.count() == 0)
        return;

    QStringList itemsList;
    itemsList << "Default comboBox Text";
    for (int i = 0; i < m_fields.count(); i++)
    {
        itemsList << m_fields.value(i).fieldName;
    }
    m_delegate = new ComboBoxDelegate();
    connect(m_delegate, SIGNAL(textChanged(QString)), this, SLOT(comboTextChanged(QString)));
    m_delegate->setItems(itemsList);

    m_model = new QStandardItemModel(m_fields.count(), 3);
    m_model->setHeaderData(0, Qt::Horizontal, tr("Column1"));
    m_model->setHeaderData(1, Qt::Horizontal, tr("Column2"));
    m_model->setHeaderData(2, Qt::Horizontal, tr("Column3"));

    tableView->setModel(m_model);
    tableView->setItemDelegateForColumn(2, m_delegate);
    tableView->setEditTriggers(QAbstractItemView::AllEditTriggers);
    for (int i = 0; i < m_model->rowCount(); i++)
    {
        tableView->openPersistentEditor(m_model->index(i, 1));
        tableView->openPersistentEditor(m_model->index(i, 2));
        m_model->setData(m_model->index(i, 2, "Default comboBox Text" Qt::DisplayRole);
        QStandardItem *item = new QStandardItem();
        item->setEditable(false);
        m_model->setItem(i, 0, item);
    }
}

Если пользоваьель вывбирает какой-то item в комбобоксе и для него назначено некое значение по умолчанию, то во второй колонке этой же строки должно появиться это дефолтовое значение, сделано это в такой функции
Код:
void Dialog::comboTextChanged(QString text)
{
    for (int i = 0; i < m_fields.count(); i++)
    {
        if (m_fields.value(i).fieldName == text)
        {
            m_model->setData(m_model->index(tableView->currentIndex().row(), 2), m_fields.value(i).defaultValue.toString(), Qt::DisplayRole);
            break;
        }
    }
}

Но результат этой функции дает о себе знать только тогда когда произошло редактирование или был щелчок по какой то ячейке грида, если сразу выбрать значение в комбобоксе, любой строки грида, то во второй колонке дефолтовое значение не отобазиться для текущей строки.
Подскажите пожалуйста как сделать так что бы у грида было нужное мне поведение.
Спасибо.


Название: Re: Необычный QTableView
Отправлено: twp от Январь 04, 2011, 14:44
может поможет viewport()->update() для QTableView после внесения изменений в модель


Название: Re: Необычный QTableView
Отправлено: crossly от Январь 05, 2011, 09:54
обновление произойдет после сабмита... который соответственно по умолчанию после OnFieldChange


Название: Re: Необычный QTableView
Отправлено: giker от Январь 05, 2011, 20:08
Ковырялся пытаясь понять в чем дело. Выяснил вот что: если не вызывать
Код:
tableView->openPersistentEditor(m_model->index(i, 1)); 
ни для какокой ячейки вообще, то все работает так как мне надо, но мне нужно показывать что в ячейке комбобокс. Почему это работает так? Как можно разрешить данную ситуацию?


Название: Re: Необычный QTableView
Отправлено: crossly от Январь 06, 2011, 14:57
потому что данные передаются в модель после закрытия эдитора... сделать делегат и отрисовать нужные вам контролы


Название: Re: Необычный QTableView
Отправлено: giker от Январь 07, 2011, 09:08
Делегат уже сделан. Но непонятно почему такое поведение просходит только при редактировании первой строки, при редактированиие всех остальных все работает так как надо, до перевода фокуса на другой контрол виджета.