Есть два делегата:
один возвращает editor типа QLineEdit другой QDateEdit.
Когда пользователь в QTableView находится в ячейке и только собирается редактировать значение, editor ещё не виден(или не создан).
Пользователь просто начинает нажимать кнопки, создаётся делегат и:
- в случае с делегатом типа QLineEdit значения нажатых клавиш сразу отображаются в editor`e,
- в случае с делегатом типа QDateEdit значение первой нажатой клавиши НЕ отображается в editor`e.
Например:
необходимо ввести дату '24.10.2008'. Нажатие на '2' просто переведёт ячейку в состояние edit, а затем будет введена дата '4' и делегат "упрётся рогом" т.к. маска(формат) ввода требует две позиции т.е. '04'
В результате производительность работы пользователя падает, а раздражающий фактор растёт.
Что можно придумать ? Как заставить editor типа QDateEdit не пропускать ввод первого символа ?
Я повесил eventFilter(QObject* obj, QEvent* e) на editor и отследил, что нажатие на первую клавишу туда поступает сразу после создания editor`a, а вот символ не рисуется.
Код создания editor`a
QWidget *QDateDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem& /*option*/,
const QModelIndex& index) const
{
QDateEdit *editor = new QDateEdit(parent);
QSocketModel *cds = qobject_cast<QSocketModel*>((QObject*)index.model());
QField *fld;
if(cds)
{
fld = cds->Fields->Columns[index.column()];
if(!fld->defaultValue().isNull())
((QDateDelegate*) this)->defaultDate = fld->defaultValue().toDate();
editor->setDisplayFormat(fld->format());
}
editor->setMinimumDate(QDate(100, 1, 1));
editor->setCalendarPopup(true);
editor->installEventFilter(const_cast<QDateDelegate*>(this));
return editor;
}
Для QLineEdit`a всё тоже самое без премудростей, но работает без раждражения.
Qt 4.3.3