我正在创建启动器应用程序(如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小部件。
通过按回车键或逃生键将发射器隐藏起来时,它会按预期工作。