隐藏然后显示父窗口小部件后,如何恢复对窗口小部件的关注?

时间:2019-04-10 15:16:17

标签: python python-2.7 pyside

我正在创建启动器应用程序(如Spotlight / Albert / Gnome-Do)。我正在使用Python 2.7和Pyside。在Windows 10上制造和使用。

它在后台运行,并使用键盘pip install keyboard)收听快捷方式。调用快捷方式后,QObject信号将调用主窗口小部件的show方法。

我的问题是,当通过按逃逸键或回车键隐藏主窗口小部件时,下次显示该窗口小部件时,焦点将位于QlineEdit中,并且用户将能够直接键入其查询。

但是,如果通过在外部单击小部件隐藏小部件(通过过滤QEvent WindowDeactivate处理),则下次调用时焦点不会放在我的QLineEdit上,这会破坏用户体验。

我尝试过使用activateWindow()或raise_(),但它没有任何改变。

这里有一个简化的示例代码,显示了我的问题:

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 + Space)并单击其他位置时,下次我调用快捷方式时,焦点将不会设置为QLineEdit小部件。

通过按回车键或逃生键将发射器隐藏起来时,它会按预期工作。

0 个答案:

没有答案