Hi all,
I have a simple QListView in which I would like to edit items by
clicking into empty space, typing, then hitting either enter or tab.
I’d like the tab Key_Tab event to behave exactly like Key_Enter event,
but it’s a bit stubborn.
When I hit tab while editing an item (i.e. editor is open), the first
item in the list is selected.
I noticed that when hitting the tab key in an open editor only a
QtCore.QEvent.ShortcutOverride is triggered.
It looks like I can simply react to that in my situation though I’m not
sure if that is wise?!
If I do, how would I manually emit an event that looks like a Key_Enter
event?
Otherwise, how can I avoid above behaviour for the tab key and make it
behave like a regular key (I assume it’s trying to change focus in the
focus chain but don’t know how to make it stop)?
Here is some example code to show my problem.
Cheers,
frank
|class AddresseeDelegate(QtWidgets.QItemDelegate): is_valid =
QtCore.Signal() is_not_valid = QtCore.Signal(QtCore.QModelIndex) def
__init__(self, users=[], groups=[], parent=None):
super(AddresseeDelegate, self).__init__(parent) self.valid_item_texts =
[u['name'] for u in users] + [g['code'] for g in groups] def
createEditor(self, parent, option, index): self.editor =
QtWidgets.QLineEdit(parent) self.editor.setMinimumWidth(100) completer =
QtWidgets.QCompleter(self.valid_item_texts)
completer.setCaseSensitivity(QtCore.Qt.CaseInsensitive)
completer.setCompletionMode(QtWidgets.QCompleter.InlineCompletion)
self.editor.setCompleter(completer)
self.editor.editingFinished.connect(lambda: self.validate_text(index))
return self.editor def setModelData(self, editor, model, index):
model.setData(index, editor.text()) def validate_text(self, index=None):
if self.editor.text() in self.valid_item_texts: # valid input
self.commitData.emit(self.editor) self.closeEditor.emit(self.editor)
self.is_valid.emit() else: # invalid input
self.closeEditor.emit(self.editor) self.is_not_valid.emit(index) class
AddresseeListView(QtWidgets.QListView): def __init__(self, users=[],
groups=[], parent=None): '''Simple addressee widget.'''
super(AddresseeListView, self).__init__(parent)
self.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers)
self.setFlow(QtWidgets.QListView.LeftToRight)
self.setResizeMode(QtWidgets.QListView.ResizeMode.Adjust)
self.setSpacing(10) self.setViewMode(QtWidgets.QListView.IconMode)
#self.setWrapping(True) # delegate delegate = AddresseeDelegate(users,
groups) self.setItemDelegate(delegate)
delegate.is_not_valid.connect(self.delete_invalid_index) # model model =
QtGui.QStandardItemModel() #model = Model() self.setModel(model) def
event(self, event): if event.type() == QtCore.QEvent.ShortcutOverride: #
need to emit a Key_Enter event here event.accept() return
super(AddresseeListView, self).event(event) def mousePressEvent(self,
event): self.add_and_edit() def add_and_edit(self): '''Add a new row and
open editor''' print 'adding row' new_item = QtGui.QStandardItem('')
self.model().appendRow(new_item)
self.edit(self.model().indexFromItem(new_item)) def
delete_invalid_index(self, index): '''Remove invalid entry'''
self.model().removeRow(index.row()) if __name__ == '__main__': app =
QtWidgets.QApplication(sys.argv) users = [{'name':'aa'}, {'name':'bb'}]
groups = [{'code':'cc'}, {'code':'dd'}] w = AddresseeListView(users,
groups) w.show() w.raise_() app.exec_() |
--
ohufxLogo 50x50 <http://www.ohufx.com>
*vfx compositing <http://ohufx.com/compositing.html> | *workflow
customisation and consulting <http://ohufx.com/customising.html>* *
*<http://ohufx.com/compositing.html>*
<http://www.nukepedia.com/nubridge>
Your gateway to over 1,000 free tools... right inside of Nuke
<http://www.nukepedia.com/nubridge>
_______________________________________________
Interest mailing list
Interest@qt-project.org
https://lists.qt-project.org/listinfo/interest