У меня данные редактируются в классе наследованном от 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?