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?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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


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




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