PySide6程序点击按钮无法在外部输入符号的问题求助
解决PySide6按钮点击抢占焦点导致无法在外部软件输入符号的问题
问题分析
点击PySide6程序中的按钮时,程序窗口会自动获取焦点,导致外部写作软件失去焦点,keyboard.write()无法将符号输入到目标软件中。
解决方案
通过禁止按钮获取焦点,并确保写入符号前激活原外部窗口来解决该问题,修改后的代码如下:
from PySide6.QtWidgets import QApplication, QPushButton, QLineEdit from PySide6.QtCore import QFile, Qt from PySide6.QtUiTools import QUiLoader import keyboard, time app = QApplication([]) # 加载UI文件 ui_file = QFile("test/ui_file.ui") ui_file.open(QFile.ReadOnly) loader = QUiLoader() window = loader.load(ui_file) ui_file.close() # 设置窗口置顶 window.setWindowFlags(window.windowFlags() | Qt.WindowStaysOnTopHint) # 获取按钮控件 pushButton_arrow = window.findChild(QPushButton, "pushButton_arrow") pushButton_checkmark = window.findChild(QPushButton, "pushButton_checkmark") pushButton_cross = window.findChild(QPushButton, "pushButton_cross") # 关键修改:禁止按钮获取焦点,避免点击时窗口抢占外部软件焦点 pushButton_arrow.setFocusPolicy(Qt.NoFocus) pushButton_checkmark.setFocusPolicy(Qt.NoFocus) pushButton_cross.setFocusPolicy(Qt.NoFocus) def write_1(a): # 获取点击按钮前的活动窗口(外部目标软件窗口) active_window = QApplication.activeWindow() if active_window and active_window != window: # 激活原外部窗口 active_window.activateWindow() # 短暂延迟确保窗口激活完成 time.sleep(0.05) keyboard.write(a) # 绑定按钮点击事件 pushButton_arrow.clicked.connect(lambda: write_1("⇒")) pushButton_cross.clicked.connect(lambda: write_1("✖")) pushButton_checkmark.clicked.connect(lambda: write_1("✔")) window.show() app.exec()
核心改动说明
- 禁止按钮获取焦点:通过
setFocusPolicy(Qt.NoFocus)让按钮在被点击时不会触发窗口焦点切换,外部软件的焦点得以保留。 - 恢复原窗口焦点:在写入符号前,获取并激活点击按钮前的活动窗口,确保符号输入到目标软件中;添加短暂延迟是为了等待窗口激活完成,避免写入操作失效。
内容的提问来源于stack exchange,提问作者ParsaTheH
相关产品推荐
相关产品推荐

