[PySide] QListView - make tab key behave like enter key

Frank Rueter | OHUfx frank at ohufx.com
Wed Mar 20 04:34:40 CET 2019


well, for those who run into the same issue:
The key was to override the view's closeEditor event, check for the 
incoming hint (QAbstractItemDelegate.NoHint when the tab key is pressed) 
and fire off QListView.closeEditor(self, editor, 
QtWidgets.QAbstractItemDelegate.SubmitModelCache) manually.

On 19/03/19 6:35 PM, Frank Rueter | OHUfx wrote:
>
> 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>
>
>
> _______________________________________________
> PySide mailing list
> PySide at qt-project.org
> https://lists.qt-project.org/listinfo/pyside

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.qt-project.org/pipermail/pyside/attachments/20190320/552516d2/attachment-0001.html>


More information about the PySide mailing list