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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Редактирование в QTableView  (Прочитано 6337 раз)
Elrock
Гость
« : Сентябрь 10, 2009, 19:44 »

У меня данные редактируются в классе наследованном от QTableView.
В качестве модели используется наследованный от QStandardItemModel;

Никакие виртуальные функции не преопределены, сигналы не перехватываются.

Делегат один на всю таблицу. Редактор в делегате универсальный - чтобы можно было редактировать различные типы данных - на подложке унаследованной от QWidget в зависимости от типа данных устанавливаются различные виджеты:

Код:
UiItemEditor::UiItemEditor(ConfigValue* config, QWidget* parent) : QWidget(parent)
{
    _config = config;
    switch(config->type()) { /
    case ConfigValue::String : {
            _status = String;
            QLineEdit* e = new QLineEdit(this);
            if(config->length() > 0) {
                e->setMaxLength(config->length());
            }
            _widget = e;
            break;
        }
    case ConfigValue::Numeric : {
            _status = Numeric;
            QDoubleSpinBox* e = new QDoubleSpinBox(this);
            _widget = e;
            break;

        }
    case ConfigValue::Integer : {
            _status = Integer;
            QSpinBox* e = new QSpinBox(this);
            int limit = 1000000000;
            e->setMaximum(limit);
            e->setMinimum(-limit);
            _widget = e;
            break;
        }
    case ConfigValue::Boolean : {
            _status = Boolean;
            QComboBox* e = new QComboBox(this);
            e->addItem(tr("No"));
            e->addItem(tr("Yes"));
            _widget = e;
            break;
        }
    case ConfigValue::Date : {
            _status = Date;
            QDateEdit* e = new QDateEdit(this);
            e->setDisplayFormat("dd.MM.yyyy");
            e->setCalendarPopup(true);
            QCalendarWidget* cw = new QCalendarWidget();
            cw->setFirstDayOfWeek(Qt::Monday);
            e->setCalendarWidget(cw);
            _widget = e;
            break;
        }
    default: {
            _status = Empty;
            QLineEdit* e = new QLineEdit(this);
            e->setReadOnly(true);
            _widget = e;
        }

    };
    _widget->setGeometry(0,0,width(),height());
    _widget->raise();
}



void UiItemEditor::resizeEvent (QResizeEvent *) {
    _widget->resize(width(),height());
}

void UiItemEditor::setValue(const QVariant& value) {
    switch (_status) {
            case String: {
                    QLineEdit* e = static_cast<QLineEdit*> (_widget);
                    e->setText(value.toString());
                    break;
                }
            case Numeric : {
                    QDoubleSpinBox* e = static_cast<QDoubleSpinBox*>(_widget);
                    e->setValue(value.toDouble());
                    break;
                }
            case Integer : {
                    QSpinBox* e = static_cast<QSpinBox*>(_widget);
                    e->setValue(value.toInt());
                    break;
                }
            case Boolean: {
                    QComboBox* e = static_cast<QComboBox*>(_widget);
                    e->setCurrentIndex(value.toBool() ? 1 : 0);
                    break;
                }
            case Date: {
                    QDateEdit* e = static_cast<QDateEdit*>(_widget);
                    e->setDate(value.toDate());
                    break;
                }
            default: {
                    QLineEdit* e = static_cast<QLineEdit*> (_widget);
                    e->setText(value.toString());
                }

            }
    _value = value;
}

QVariant UiItemEditor::value() {
    switch (_status) {
    case String : {
            QLineEdit* e = static_cast<QLineEdit*> (_widget);
            return e->text();
        }
            case Numeric : {
                    QDoubleSpinBox* e = static_cast<QDoubleSpinBox*>(_widget);
                    return e->value();
                }
            case Integer : {
                    QSpinBox* e = static_cast<QSpinBox*>(_widget);
                    return e->value();
                }
            case Boolean: {
                    QComboBox* e = static_cast<QComboBox*>(_widget);
                    return (e->currentIndex() == 1);
                }
            case Date: {
                    QDateEdit* e = static_cast<QDateEdit*>(_widget);
                    return e->date();
                    break;
                }
            default:
                return _value;
            }
    return _value;
}


Вообше то все работает. Но есть вопросы:

1. Чтобы начать редактирование, нужно двойным кликом создать виджет редакторования в ячейке и еще один клик чтобы начать редактирование. Многовато. Можно сделать меньше?

2. Как приступить к редактированию ячейки нажатием клавиши Enter?
Записан
Elrock
Гость
« Ответ #1 : Сентябрь 12, 2009, 16:34 »

Первый вопрос разрешился таким образом при помощи подсказки знающих людей:

UiReferenceWidget::UiReferenceWidget(QWidget* parent) : QTableView(parent)
{
 
    _model = new UiReferenceModel();
    setModel(_model);
    setSelectionBehavior( QAbstractItemView::SelectRows );
 
 // Добавлено вот это.

  QAbstractItemView::EditTriggers triggers = editTriggers();
    triggers |= QAbstractItemView::CurrentChanged;
     setEditTriggers(triggers);
}

Вторая проблемва - как приступить к редактированию ячейки после Enter никак не получается.
Записан
Elrock
Гость
« Ответ #2 : Сентябрь 13, 2009, 09:07 »

Проблеме решилась созданием класса, используемого в делегате, который в зависимости от типа данных размешает в виджете parent нужные виджеты для редактирования - QLineEdit, QSpinBox и т.д.
Записан
break
Гипер активный житель
*****
Offline Offline

Сообщений: 846


Просмотр профиля
« Ответ #3 : Октябрь 18, 2009, 01:31 »

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


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