Как восстановить фокус на виджете после скрытия, а затем показа родительского виджета? - PullRequest
0 голосов
/ 10 апреля 2019

Я создаю приложение для запуска (например, Spotlight / Albert / Gnome-Do).Я использую Python 2.7 и Pyside.Сделано и используется в Windows 10.

Он работает в фоновом режиме и слушает ярлык с клавиатуры (pip install keyboard).Когда вызывается ярлык, сигнал QObject вызывает метод show моего основного виджета.

Моя проблема в том, что когда главный виджет скрывается нажатием клавиши escape или return, при следующем отображении виджета фокус будетбыть в QlineEdit, и пользователь сможет сразу набрать его запрос.

Но когда виджет скрыт, если щелкнуть за пределами виджета (обрабатывается путем фильтрации QEvent WindowDeactivate), фокус не будет на моемQLineEdit при следующем вызове, который портит пользовательский опыт.

Я пытался поиграть с activWindow () или повышение_ (), но это ничего не меняет.

Вот здесь упрощенный примеркод, который показывает мою проблему:

import sys
import keyboard
from PySide.QtCore import *
from PySide.QtGui import *

SHORTCUT = 'Ctrl+space'


class ShortcutThread(QObject):
    signal = Signal()


class Launcher(QMainWindow):
    def __init__(self, parent=None):
        super(Launcher, self).__init__()
        self.setWindowFlags(Qt.FramelessWindowHint | Qt.WindowStaysOnTopHint | Qt.Popup)
        self.resize(500, 50)
        self.central_widget = QWidget()
        self.setCentralWidget(self.central_widget)
        self.layout_ = QHBoxLayout()
        self.central_widget.setLayout(self.layout_)
        self.search = QLineEdit()
        self.layout_.addWidget(self.search)

    def eventFilter(self, obj, event):
        # Hide dialog when losing focus
        if event.type() == QEvent.WindowDeactivate:
            self.hide()
        return super(Launcher, self).eventFilter(obj, event)

    def keyPressEvent(self, e):
        # Hide dialog when pressing escape or return
        if e.key() in [Qt.Key_Escape, Qt.Key_Return]:
            self.hide()


def main():
    app = QApplication(sys.argv)
    app.setQuitOnLastWindowClosed(False)

    launcher = Launcher()

    shortcut = ShortcutThread()
    shortcut.signal.connect(launcher.show)

    keyboard.add_hotkey(SHORTCUT, shortcut.signal.emit, args=[])

    launcher.show()
    sys.exit(app.exec_())


if __name__ == '__main__':
    main()

Когда я вызываю ярлык (Ctrl + пробел здесь) и нажимаю в другом месте, в следующий раз, когда я вызову ярлык, фокус не будет установлен на виджет QLineEdit.

Когда средство запуска скрывается нажатием клавиши возврата или выхода, оно работает как положено.

...