[PySide] QListView - make tab key behave like enter key
Frank Rueter | OHUfx
frank at ohufx.com
Thu Mar 21 04:02:58 CET 2019
using the editorClose virtual function and examining the edit hint did
the trick in the end.
Thanks,
frank
On 21/03/19 3:38 AM, Cristián Maureira-Fredes wrote:
> Hello Frank,
>
> You can try to use an event filter to intercept the key press events.
> https://doc.qt.io/qt-5/qobject.html#installEventFilter
>
> Other option could be to re-implement the keyPressedEvent
> https://doc.qt.io/qt-5/qlineedit.html#keyPressEvent
>
> Cheers
>
> ________________________________________
> From: PySide <pyside-bounces at qt-project.org> on behalf of Frank Rueter | OHUfx <frank at ohufx.com>
> Sent: Tuesday, March 19, 2019 06:35
> To: pyside at qt-project.org; interest at qt-project.org
> Subject: [PySide] QListView - make tab key behave like enter key
>
> 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://nukepedia.com/images/nuBridge/logo/nuBridge_logo.png] <http://www.nukepedia.com/nubridge>
>
>
> Your gateway to over 1,000 free tools... right inside of Nuke<http://www.nukepedia.com/nubridge>
>
More information about the PySide
mailing list