尝试模仿PyQt的Windows搜索

时间:2019-08-11 14:38:10

标签: python-3.x pyqt5

所以我试图复制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_())

1 个答案:

答案 0 :(得分:-1)

QWidget.activateWindow()文档报告指出:

  

在Windows上,如果您在应用程序未运行时调用此函数   当前处于活动状态的窗口,则不会使其成为活动窗口。   它将更改任务栏条目的颜色,以指示   窗口以某种方式改变了。这是因为Microsoft不   允许应用程序中断用户当前正在执行的操作   另一个应用程序。

还有QWindow.requestActivate(),即使我担心它会得到相同的结果。

很遗憾,我无法像现在在Linux上那样对其进行测试,但是QWindowsWindowFunctions.setWindowActivationBehavior()可能很有希望。