所以我试图复制Windows 10本机搜索栏的行为,例如:
用户按下某些组合键->出现搜索栏,已经具有输入焦点
用户点击离开\焦点丢失->搜索栏消失
我已经充分利用了其中的大部分功能,整个应用程序是一个继承自QMainWindow
的窗口,一旦发现失去焦点,便在其中使用self.hide()
。
我已使用keyboard
库将一些键组合绑定到以下方法:
def bringToTop(self) -> None:
print('got focus')
self.show()
self.raise_()
self.setWindowState(self.windowState() & ~Qt.WindowMinimized | Qt.WindowActive)
self.activateWindow()
self.lineEdit.setFocus()
我只想弹出窗口并将输入焦点设置在lineEdit
上,但是它只是在任务栏中以橙色闪烁。
我已经尝试了bringToTop
中许多行的组合,但是没有用。
我的代码的简化版本:
import sys
import keyboard
from PyQt5.QtCore import Qt, QRect
from PyQt5.QtGui import QFocusEvent
from PyQt5.QtWidgets import QLineEdit, QMainWindow, QApplication
class SearchWindow(QMainWindow):
def __init__(self):
super().__init__()
self.setEnabled(True)
self.setObjectName("MainWindow")
self.setWindowModality(Qt.NonModal)
self.setContextMenuPolicy(Qt.DefaultContextMenu)
self.setFocusPolicy(Qt.ClickFocus)
self.setAutoFillBackground(False)
self.setFixedSize(300, 50)
self.setWindowFlags(Qt.WindowFlags(Qt.FramelessWindowHint))
self.lineEdit = QLineEdit(self)
self.lineEdit.setGeometry(QRect(30, 10, 230, 20))
self.lineEdit.setObjectName("lineEdit")
self.lineEdit.setFocusPolicy(Qt.ClickFocus)
keyboard.add_hotkey('win+z', self.bringToTop)
self.bringToTop()
def focusOutEvent(self, a0: QFocusEvent) -> None:
self.hide()
def bringToTop(self) -> None:
print('got focus')
self.show()
self.raise_()
self.setWindowState(self.windowState() & ~Qt.WindowMinimized | Qt.WindowActive)
self.activateWindow()
self.lineEdit.setFocus()
if __name__ == "__main__":
app = QApplication(sys.argv)
window = SearchWindow()
sys.exit(app.exec_())
答案 0 :(得分:-1)
QWidget.activateWindow()
文档报告指出:
在Windows上,如果您在应用程序未运行时调用此函数 当前处于活动状态的窗口,则不会使其成为活动窗口。 它将更改任务栏条目的颜色,以指示 窗口以某种方式改变了。这是因为Microsoft不 允许应用程序中断用户当前正在执行的操作 另一个应用程序。
还有QWindow.requestActivate()
,即使我担心它会得到相同的结果。
很遗憾,我无法像现在在Linux上那样对其进行测试,但是QWindowsWindowFunctions.setWindowActivationBehavior()
可能很有希望。