Всем привет.
Есть у меня табличка, данные которой редактирую через делегаты. Для этих делегатов мне нужно такое поведение, что бы дынные фиксировались обратно в модель, только при нажатии Enter, во всех остальных случаях происходил откат к старым данным. Не нашёл никакого другого решения, кроме как перекрыть метод eventFilter у делегата.
Для редактирования через QSpinBox, достаточно оказалось следущего кода
bool SpinBoxDelegate::eventFilter(QObject* editor, QEvent* event )
{
QSpinBox* spinBox = static_cast<QSpinBox*>(editor);
if (event->type() == QEvent::KeyPress) {
QKeyEvent* keyEvent = static_cast<QKeyEvent*>(event);
if(keyEvent->key() == Qt::Key_Tab || keyEvent->key() == Qt::Key_Backtab) {
emit closeEditor(spinBox);
return true;
}
} else if (event->type() == QEvent::FocusOut) {
emit closeEditor(spinBox);
return true;
}
return QItemDelegate::eventFilter(editor, event);
}
bool ComboBoxDelegate::eventFilter(QObject* editor, QEvent* event )
{
static bool flag = false;
QComboBox* comboBox = static_cast<QComboBox*>(editor);
if (event->type() == QEvent::KeyPress) {
QKeyEvent* keyEvent = static_cast<QKeyEvent*>(event);
if(keyEvent->key() == Qt::Key_Tab || keyEvent->key() == Qt::Key_Backtab) {
emit closeEditor(comboBox);
return true;
} else if(keyEvent->key() == Qt::Key_Right || keyEvent->key() == Qt::Key_Left) {
return true;
}
}
return QItemDelegate::eventFilter(editor, event);
}
извини не по теме.
объясни пожалуйста почему static_cast пользуешь?
Сам я для классов наследованных от QObject всегда использовал qobject_cast, в данном случае синтаксис перенял из примера в ассистенте. Или вопрос почему не dynamic_cast? Насколько я понимаю здесь нет динамического приведения типов.
igor_bogomolov,
ясно.
мне вот эти строчки показалась опасными при поддержке или если придется код заимствовать.
Продублирую, что бы закрыть тему.
Решил так:
bool ComboBoxDelegate::eventFilter(QObject* editor, QEvent* event )
{
QComboBox * comboBox = static_cast<QComboBox*>(editor);
if (comboBox) {
if (event->type() == QEvent::KeyPress) {
QKeyEvent * keyEvent = static_cast<QKeyEvent*>(event);
if(keyEvent->key()==Qt::Key_Tab || keyEvent->key()==Qt::Key_Backtab) {
emit closeEditor(comboBox, QAbstractItemDelegate::RevertModelCache);
return true;
} else if(keyEvent->key() == Qt::Key_Right || keyEvent->key() == Qt::Key_Left) {
return true;
}
} else if (event->type() == QEvent::FocusOut) {
QWidget * widget = qApp->focusWidget();
if(!widget) return false;
if (QLatin1String(widget->metaObject()->className()) == QLatin1String("QComboBoxListView") ||
QLatin1String(widget->metaObject()->className()) == QLatin1String("QComboBox" )) {
return true;
}
emit closeEditor(comboBox, QAbstractItemDelegate::RevertModelCache);
return true;
}
}
return QItemDelegate::eventFilter(editor, event);
}
igor_bogomolov, я вот думаю как бы тему переобозвать, чтобы соответствовать конечной задаче.
Не знаю. Например - "Как отловить потерю фокуса у QComboBox в делегате"
Как только указать, что имеется в виду "полная" потеря фокуса виджетом, а не переход фокуса на его выпадающий список?
В подзаголовке что-нибудь написать? Не знаю правда, осуществляется ли по нему поиск? С поиском на сайте - беда полнейшая. Очень тяжело что либо искать
Могу так же выложить свои делегаты имитирующие виджеты(QPushButton, QLineEdit, QCheckBox(точнее его чекер)). http://www.prog.org.ru/topic_11696_0.html
О. Вон оно как.
Я в общем то не против. Хотя сам бы никогда такую тему не нашел.
Может, все таки по Русски как то обозвать. "откат к старым данным при редактировании через делегат" ?
Хотя, мне на самом деле без разницы. Делай так как считаешь нужным
Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)