crossplatform.ru

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

> [РЕШЕНО] откат к старым данным при редактировании через делегат (QItemDelegate::eventFilter)
igor_bogomolov
  опции профиля:
сообщение 28.9.2009, 18:27
Сообщение #1


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

Группа: Сомодератор
Сообщений: 1215
Регистрация: 22.3.2009
Из: Саратов
Пользователь №: 630

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




Репутация:   29  


Всем привет.

Есть у меня табличка, данные которой редактирую через делегаты. Для этих делегатов мне нужно такое поведение, что бы дынные фиксировались обратно в модель, только при нажатии Enter, во всех остальных случаях происходил откат к старым данным. Не нашёл никакого другого решения, кроме как перекрыть метод eventFilter у делегата.
Для редактирования через QSpinBox, достаточно оказалось следущего кода
SpinBoxDelegate::eventFilter
bool SpinBoxDelegate::eventFilter(QObject* editor, QEvent* event )
{
    QSpinBox* spinBox = static_cast<QSpinBox*>(editor);
    if (event->type() == QEvent::KeyPress) {
        QKeyEvent* keyEvent = static_cast<QKeyEvent*>(event);
        if(keyEvent->key() == Qt::Key_Tab || keyEvent->key() == Qt::Key_Backtab) {
            emit closeEditor(spinBox);
            return true;
        }
    } else if (event->type() == QEvent::FocusOut) {
        emit closeEditor(spinBox);
        return true;
    }
    return QItemDelegate::eventFilter(editor, event);
}

А вот для случая редактирования через QComboBox, подобного поведения никак добиться не получается :(
ComboBoxDelegate::eventFilter
bool ComboBoxDelegate::eventFilter(QObject* editor, QEvent* event )
{
    static bool flag = false;
    QComboBox* comboBox = static_cast<QComboBox*>(editor);
    if (event->type() == QEvent::KeyPress) {
        QKeyEvent* keyEvent = static_cast<QKeyEvent*>(event);
        if(keyEvent->key() == Qt::Key_Tab || keyEvent->key() == Qt::Key_Backtab) {
            emit closeEditor(comboBox);
            return true;
        } else if(keyEvent->key() == Qt::Key_Right || keyEvent->key() == Qt::Key_Left) {
            return true;
        }
    }
    return QItemDelegate::eventFilter(editor, event);
}

Кто сможет подправить так, чтобы при щелчке мышкой вне комбо бокса и его выпадающего списка, редактирование закрывалось, но данные в модель не фиксировались?
Или может есть какой другой способ добиться такого поведения?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
igor_bogomolov
  опции профиля:
сообщение 14.12.2009, 17:37
Сообщение #2


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

Группа: Сомодератор
Сообщений: 1215
Регистрация: 22.3.2009
Из: Саратов
Пользователь №: 630

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




Репутация:   29  


Продублирую, что бы закрыть тему.

Решил так:
bool ComboBoxDelegate::eventFilter(QObject* editor, QEvent* event )
{
    QComboBox * comboBox = static_cast<QComboBox*>(editor);
    if (comboBox) {
        if (event->type() == QEvent::KeyPress) {
            QKeyEvent * keyEvent = static_cast<QKeyEvent*>(event);
            if(keyEvent->key()==Qt::Key_Tab || keyEvent->key()==Qt::Key_Backtab) {
                emit closeEditor(comboBox, QAbstractItemDelegate::RevertModelCache);
                return true;
            } else if(keyEvent->key() == Qt::Key_Right || keyEvent->key() == Qt::Key_Left) {
                return true;
            }
        } else if (event->type() == QEvent::FocusOut) {
            QWidget * widget = qApp->focusWidget();
            if(!widget) return false;

            if (QLatin1String(widget->metaObject()->className()) == QLatin1String("QComboBoxListView") ||
                QLatin1String(widget->metaObject()->className()) == QLatin1String("QComboBox" )) {
                return true;
            }

            emit closeEditor(comboBox, QAbstractItemDelegate::RevertModelCache);
            return true;
        }
    }
    return QItemDelegate::eventFilter(editor, event);
}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме


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


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




RSS Текстовая версия Сейчас: 28.12.2024, 12:26