Item Delegate

Alles rund um die Programmierung mit Qt
Antworten
qt_kot
Beiträge: 6
Registriert: 26. Januar 2008 12:58

Item Delegate

Beitrag von qt_kot »

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;
}
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Beitrag von RHBaum »

So viel machst gar ned falsch ^^

Was du beschreibst, ist eher das uebliche verhalten einer gui ....
Nen focuswechsel mit der Mouse sollte eigentlich immer drinn sein.
Controlls, die mir die mousklicks abfangen und verwerfen, weil ich das alte eingabefeld noch ned richtig abgearbeitet hatte, wuerd ich eher auch als nerfig empfinden. Ebenso dachten halt auch die windows GUI richtlinien entwickler und auch die qt programmierer

Hasst du schon mal eine Anwendung gesehen, die es aehnlich wie Du magst, gahandhabt hat.

Dementprechend tief muesstest auch ins system eingreifen, um dein gewuenschtes verhalten herbeizufuehren.
DU kannst den clickauf andere controls abfangen z.b. und gar ned durchlassen, wenn dein aktuelles eingabefeld nicht schliessbereit ist.

Ich wuerd aber eher andere wege gehen ...
korrekte eingaben erzwingt man eher und besser mit modalen Eingabedialogen.

Also in deinem view wird ich ein delegate bauen mit einem label, was den aktuellen stand anzeigt, und einem pushbutton mit 3 punkten drauf, fuer ne erweiterte eingabe. der macht nen eigenen dialog fuer die spezialisierte eingabe auf, und man kann immer mit ok oder abbrechen den schliessen. Glaub das entspricht mehr dem Wesen deiner eingabe.
Der modale dialog kann dann auch direkt ins Model schreiben und braucht ned ueber die editierfunktionen gehen ....

Ciao ....
Antworten