[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