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 <[email protected]> on behalf of Frank Rueter | OHUfx 
<[email protected]>
Sent: Tuesday, March 19, 2019 06:35
To: [email protected]; [email protected]
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>


_______________________________________________
PySide mailing list
[email protected]
https://lists.qt-project.org/listinfo/pyside

Reply via email to