Item Delegate
Verfasst: 17. August 2009 22:21
Hallo ich versuche einen ItemDelegate neu zu implementieren
Ziel ist es eine Prüfung einzubauen bevor die Eingabe im Editor an das Model übergeben wird. Das Beispiel zeigt meinen Ansatz. Die Eingabe über die Tastatur klappt einwandfrei die Meldung kommt hoch und der Editor bleibt bestehen. Mein Problem ist wenn ich mit der Maus auf ein anderes Item klicke wird zwar die Prüfung aufgerufen jedoch die Daten werden auch im Fehlerfall in das Model übernommen und der Editor zerstört.
Wäre super einen Tip zu bekommen was ich falsch mache
Danke mal im Voraus
bool MStringEdit::checkData(QWidget *editor)
{
QLineEdit *LineEdit = qobject_cast<QLineEdit *>(editor);
if (LineEdit->text() == "xx") {
emit commitData(editor);
emit closeEditor(editor, QAbstractItemDelegate::EditNextItem);
return false;
} else {
QMessageBox::critical(editor, tr("Falsche Eingabe"),tr("Nur xx zulässig"));
}
return true;
}
bool MStringEdit::eventFilter(QObject *object, QEvent *event)
{
QWidget *editor = ::qobject_cast<QWidget*>(object);
if (!editor)
return false;
qDebug() << "Event: " << event->type();
if (event->type() == QEvent::KeyPress) {
switch (static_cast<QKeyEvent *>(event)->key()) {
case Qt::Key_Tab:
case Qt::Key_Backtab:
case Qt::Key_Up:
case Qt::Key_Down:
case Qt::Key_Enter:
case Qt::Key_Return:
return checkData(editor);
case Qt::Key_Escape:
emit closeEditor(editor, QAbstractItemDelegate::RevertModelCache);
break;
default:
return false;
}
if (editor->parentWidget())
editor->parentWidget()->setFocus();
return true;
} else if (event->type() == QEvent::FocusOut) {
if (!editor->isActiveWindow() || (QApplication::focusWidget() != editor)) {
QWidget *w = QApplication::focusWidget();
while (w) {
if (w == editor)
return false;
w = w->parentWidget();
}
return checkData(editor);
//emit commitData(editor);
//emit closeEditor(editor, NoHint);
}
}
return false;
}
Ziel ist es eine Prüfung einzubauen bevor die Eingabe im Editor an das Model übergeben wird. Das Beispiel zeigt meinen Ansatz. Die Eingabe über die Tastatur klappt einwandfrei die Meldung kommt hoch und der Editor bleibt bestehen. Mein Problem ist wenn ich mit der Maus auf ein anderes Item klicke wird zwar die Prüfung aufgerufen jedoch die Daten werden auch im Fehlerfall in das Model übernommen und der Editor zerstört.
Wäre super einen Tip zu bekommen was ich falsch mache
Danke mal im Voraus
bool MStringEdit::checkData(QWidget *editor)
{
QLineEdit *LineEdit = qobject_cast<QLineEdit *>(editor);
if (LineEdit->text() == "xx") {
emit commitData(editor);
emit closeEditor(editor, QAbstractItemDelegate::EditNextItem);
return false;
} else {
QMessageBox::critical(editor, tr("Falsche Eingabe"),tr("Nur xx zulässig"));
}
return true;
}
bool MStringEdit::eventFilter(QObject *object, QEvent *event)
{
QWidget *editor = ::qobject_cast<QWidget*>(object);
if (!editor)
return false;
qDebug() << "Event: " << event->type();
if (event->type() == QEvent::KeyPress) {
switch (static_cast<QKeyEvent *>(event)->key()) {
case Qt::Key_Tab:
case Qt::Key_Backtab:
case Qt::Key_Up:
case Qt::Key_Down:
case Qt::Key_Enter:
case Qt::Key_Return:
return checkData(editor);
case Qt::Key_Escape:
emit closeEditor(editor, QAbstractItemDelegate::RevertModelCache);
break;
default:
return false;
}
if (editor->parentWidget())
editor->parentWidget()->setFocus();
return true;
} else if (event->type() == QEvent::FocusOut) {
if (!editor->isActiveWindow() || (QApplication::focusWidget() != editor)) {
QWidget *w = QApplication::focusWidget();
while (w) {
if (w == editor)
return false;
w = w->parentWidget();
}
return checkData(editor);
//emit commitData(editor);
//emit closeEditor(editor, NoHint);
}
}
return false;
}