crossplatform.ru

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

 
Ответить в данную темуНачать новую тему
> Необычный QTableView
giker
  опции профиля:
сообщение 3.1.2011, 11:55
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 26
Регистрация: 18.5.2010
Пользователь №: 1731

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




Репутация:   0  


С Новым годом коллеги! Возникла следующая проблема. Сделан грид на основе 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;
        }
    }
}


Но результат этой функции дает о себе знать только тогда когда произошло редактирование или был щелчок по какой то ячейке грида, если сразу выбрать значение в комбобоксе, любой строки грида, то во второй колонке дефолтовое значение не отобазиться для текущей строки.
Подскажите пожалуйста как сделать так что бы у грида было нужное мне поведение.
Спасибо.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
giker
  опции профиля:
сообщение 5.1.2011, 20:09
Сообщение #2


Студент
*

Группа: Участник
Сообщений: 26
Регистрация: 18.5.2010
Пользователь №: 1731

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




Репутация:   0  


Ковырялся пытаясь понять в чем дело. Выяснил вот что: если не вызывать
tableView->openPersistentEditor(m_model->index(i, 1));

ни для какокой ячейки вообще, то все работает так как мне надо, но мне нужно показывать что в ячейке комбобокс. Почему это работает так? Как можно разрешить данную ситуацию?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 2.12.2024, 0:15