Ich habe eine Unterklasse von QStyledItemDelegate
, die im Moment keine Funktionen neu implementiert (zur Vereinfachung der Frage).QStyledItemDelegate teilweise Text des voreingestellten QLineEdit Editors
Mit Standard QStyledItemDelegate
Implementierung, wenn der Benutzer Text in einem QTableView
zu bearbeiten beginnt, zieht der Delegierte eine QLineEdit
mit dem Text aus dem Modell und wählt alle davon (hebt alle für die Bearbeitung).
Der Text steht für Dateinamen wie "document.pdf". Der Benutzer darf den gesamten Text bearbeiten, ich möchte jedoch nur den Basisnamensteil ("Dokument") und nicht das Suffix ("pdf") markieren. Wie kann ich das machen? (Ich weiß nicht, die Logik müssen, wie dies zu tun, ich muss wissen, wie die QStyledItemDelegate
zu bekommen einen Teil des Textes zu markieren)
Ich habe versucht:
in
setEditorData()
verwendetQLineEdit::setSelection()
um etwas Text hervorzuheben. Dies hat keine Auswirkung.paint()
inpaint()
versucht zu malen basierend auf was andere Befragten zu ähnlichen Fragen empfohlen haben, aber keinen Erfolg. Ich habe wenig Erfahrung mitQPainter
. Hier ein Beispiel: Adjusting the selection behaviour of QStandardItem with QStyledItemDelegate
Bitte helfen Sie, und danke im Voraus. Ein Codeschnipsel mit sagen, die ersten 3 Zeichen des Textes auswählen würde sehr geschätzt werden.
Sie können Ihr Modell den Dateinamen ohne Erweiterung zurückgeben, wenn die Rolle 'Qt :: EditRole' ist. Auf diese Weise kann der Benutzer die Erweiterung nicht ändern. – Mike
Wenn Sie möchten, dass die Erweiterung bearbeitbar ist, müssen Sie die Auswahl nicht malen. Sie müssen die Auswahl wirklich auf die Zeilenbearbeitung setzen, um die Erweiterung auszuschließen. Der zweite Ansatz, den Sie erwähnen, wird für Sie nicht funktionieren. – Mike
überschreiben 'setEditorData' und setzen Sie die Auswahl, die Sie wollen, sollte es gut funktioniert haben. Aber in [Qt-Quellcode] (https://code.woboq.org/qt5/qtbase/src/widgets/itemviews/qabstractitemview.cpp.html#4217) können Sie einen Aufruf von 'le-> selectAll() sehen ; 'nach' setEditorData'. Leider bedeutet dies, dass die Auswahl, die Sie in 'setEditorData' eingeben, sich bei diesem Aufruf ändert. Deshalb funktioniert dein erster Ansatz nicht. – Mike