crossplatform.ru

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

 
Ответить в данную темуНачать новую тему
> Редактирование в QTableView
Elrock
  опции профиля:
сообщение 11.9.2009, 6:48
Сообщение #1


Новичок


Группа: Новичок
Сообщений: 3
Регистрация: 21.1.2008
Пользователь №: 75

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




Репутация:   0  


У меня данные редактируются в классе наследованном от 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?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 11.9.2009, 11:24
Сообщение #2


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

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

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




Репутация:   34  


    QAbstractItemView::EditTriggers triggers = ui->tableWidget->editTriggers();
    triggers |= QAbstractItemView::CurrentChanged;
    ui->tableWidget->setEditTriggers(triggers);
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 11.9.2009, 16:29
Сообщение #3


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


Elrock, прочитай тему "Справка по кнопкам и тэгам форума"

Цитата(Elrock @ 11.9.2009, 10:48) *
2. Как приступить к редактированию ячейки нажатием клавиши Enter?
по умолчанию должно именно так работать.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 11.9.2009, 16:43
Сообщение #4


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

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

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




Репутация:   34  


Цитата(Litkevich Yuriy @ 11.9.2009, 17:29) *
Elrock, прочитай тему "Справка по кнопкам и тэгам форума"

Цитата(Elrock @ 11.9.2009, 10:48) *
2. Как приступить к редактированию ячейки нажатием клавиши Enter?
по умолчанию должно именно так работать.

Это странно, т.к. у меня редактируется ячейка также как в Excel - по F2. А по Enter ничего не происходит (в Excel это перемещение на следующую ячейку).
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Elrock
  опции профиля:
сообщение 11.9.2009, 17:05
Сообщение #5


Новичок


Группа: Новичок
Сообщений: 3
Регистрация: 21.1.2008
Пользователь №: 75

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




Репутация:   0  


Спасибо. Ячейку уже можно редакьтировать после двойного клика.

Но осталась вторая проблема

В виджете наследованном от QTableView переопределил :

void UiReferenceWidget::keyPressEvent ( QKeyEvent * event ) {
    if (event->key() == Qt::Key_Return) {
        QModelIndex i = currentIndex ();
        if (i.isValid()) {
            edit(i);
            return;
        }
    }
    QTableView::keyPressEvent(event);
}


Теперь при нажатии клавиши Enter создаеьтся редактор. Как сразу получит фокус ввода с клавиатуры, чтобы после нажатия Enter отредактировать ячейку - как это сделано в 1С Предприятии?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Elrock
  опции профиля:
сообщение 13.9.2009, 9:11
Сообщение #6


Новичок


Группа: Новичок
Сообщений: 3
Регистрация: 21.1.2008
Пользователь №: 75

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




Репутация:   0  


Проблеме решилась созданием класса, используемого в делегате, который в зависимости от типа данных размешает в виджете parent нужные виджеты для редактирования - QLineEdit, QSpinBox и т.д.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




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