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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QTableView + QItemDelegate  (Прочитано 7471 раз)
Zmeishe
Гость
« : Октябрь 24, 2008, 08:12 »

Есть два делегата:
один возвращает 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
« Последнее редактирование: Октябрь 24, 2008, 08:30 от Zmeishe » Записан
registrationfedser87
Гость
« Ответ #1 : Октябрь 24, 2008, 08:56 »

Тебе наверно надо поиграться с триггерами редактирования(и eventFilter наверно не понадобится). Для проверки попробуй в QTableView включить все тригеры:
Код:
tableView->setEditTriggers(QAbstractItemView::AllEditTriggers);
Записан
Zmeishe
Гость
« Ответ #2 : Октябрь 24, 2008, 09:16 »

Ещё неудобнее, т.к. ячейка сразу и всегда в режиме edit. При попытке переместиться на другую строку клавишами со стрелками происходит изменение значений дня/месяца/года т.к. QDateEdit наследник от QAbstractSpinBox.

Записан
kirill
Гость
« Ответ #3 : Октябрь 24, 2008, 12:42 »

Перепиши QDateEdit
Записан
Zmeishe
Гость
« Ответ #4 : Октябрь 24, 2008, 13:14 »

Проще в QLineEdit validator и inputMask воткнуть.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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