Work around Qt's focus bug (fix help-wanted#22)

Manually hide the editor's completer popup before accepting a short cut which changes the focus widget. Thus, work around the bug in PyQt 5.15 where a QLineEdit with open QCompleter popup won't get notified about focus changes handled by the Main Window, leading to inconsistent focus.
This commit is contained in:
RumovZ 2020-10-24 10:47:25 +02:00
parent 3d95d9e3c6
commit aaf5770db9
2 changed files with 13 additions and 0 deletions

View File

@ -195,6 +195,10 @@ class AddCards(QDialog):
self.editor.saveAddModeVars() self.editor.saveAddModeVars()
if not self.addNote(self.editor.note): if not self.addNote(self.editor.note):
return return
# workaround for PyQt focus bug
self.editor.hideCompleters()
tooltip(_("Added"), period=500) tooltip(_("Added"), period=500)
av_player.stop_and_clear_queue() av_player.stop_and_clear_queue()
self.onReset(keep=True) self.onReset(keep=True)

View File

@ -1061,6 +1061,9 @@ QTableView {{ gridline-color: {grid} }}
self.maybeRefreshSidebar() self.maybeRefreshSidebar()
def focusSidebar(self) -> None: def focusSidebar(self) -> None:
# workaround for PyQt focus bug
self.editor.hideCompleters()
self.sidebarDockWidget.setVisible(True) self.sidebarDockWidget.setVisible(True)
self.sidebarTree.setFocus() self.sidebarTree.setFocus()
@ -2072,10 +2075,16 @@ where id in %s"""
sm.select(item, QItemSelectionModel.SelectCurrent | QItemSelectionModel.Rows) sm.select(item, QItemSelectionModel.SelectCurrent | QItemSelectionModel.Rows)
def onFind(self): def onFind(self):
# workaround for PyQt focus bug
self.editor.hideCompleters()
self.form.searchEdit.setFocus() self.form.searchEdit.setFocus()
self.form.searchEdit.lineEdit().selectAll() self.form.searchEdit.lineEdit().selectAll()
def onNote(self): def onNote(self):
# workaround for PyQt focus bug
self.editor.hideCompleters()
self.editor.web.setFocus() self.editor.web.setFocus()
self.editor.loadNote(focusTo=0) self.editor.loadNote(focusTo=0)