Russian Qt Forum
Ноябрь 25, 2024, 03:50 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Необычный QTableView  (Прочитано 3860 раз)
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;
        }
    }
}

Но результат этой функции дает о себе знать только тогда когда произошло редактирование или был щелчок по какой то ячейке грида, если сразу выбрать значение в комбобоксе, любой строки грида, то во второй колонке дефолтовое значение не отобазиться для текущей строки.
Подскажите пожалуйста как сделать так что бы у грида было нужное мне поведение.
Спасибо.
Записан
twp
Гость
« Ответ #1 : Январь 04, 2011, 14:44 »

может поможет viewport()->update() для QTableView после внесения изменений в модель
Записан
crossly
Гость
« Ответ #2 : Январь 05, 2011, 09:54 »

обновление произойдет после сабмита... который соответственно по умолчанию после OnFieldChange
Записан
giker
Гость
« Ответ #3 : Январь 05, 2011, 20:08 »

Ковырялся пытаясь понять в чем дело. Выяснил вот что: если не вызывать
Код:
tableView->openPersistentEditor(m_model->index(i, 1)); 
ни для какокой ячейки вообще, то все работает так как мне надо, но мне нужно показывать что в ячейке комбобокс. Почему это работает так? Как можно разрешить данную ситуацию?
Записан
crossly
Гость
« Ответ #4 : Январь 06, 2011, 14:57 »

потому что данные передаются в модель после закрытия эдитора... сделать делегат и отрисовать нужные вам контролы
Записан
giker
Гость
« Ответ #5 : Январь 07, 2011, 09:08 »

Делегат уже сделан. Но непонятно почему такое поведение просходит только при редактировании первой строки, при редактированиие всех остальных все работает так как надо, до перевода фокуса на другой контрол виджета.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.044 секунд. Запросов: 21.