我正在使用 PyQt 设计一个应用程序。出于可访问性的原因,我想在突出显示按钮时说出按钮的名称(使用 Tab 键导航。)
我使用 Windows Speech API 顺利录制了语音。现在我想使用信号和插槽,但是 QPushButton 在突出显示时似乎没有信号。我发现的那些被点击、破坏、按下、释放、切换。它们都不起作用。
有什么方法可以设置当按钮被选项卡突出显示时发出的自定义信号吗?
QApplication
负责管理小部件焦点,因此您可以连接到其focusChanged信号:
QtGui.qApp.focusChanged.connect(self.handleFocusChanged)
信号发送对已失去/接收焦点(通过任何方式)的前一个/当前小部件的引用,因此处理程序可能如下所示:
def handleFocusChanged(self, old, new):
if old is not None and new is not None:
if isinstance(new, QtGui.QPushButton):
print('Button:', new.text())
elif isinstance(new, QtGui.QLineEdit):
print('Line Edit:', new.objectName())
# and so forth...
您还可以使用以下方式获取当前具有焦点的小部件:
widget = QtGui.qApp.focusWidget()
虽然 @ekhumoro 接受的答案有效,并且是更好的方法(在我看来),但也可以通过子类化 QPushButton 来实现这一点。像这样的东西:
from PyQt4.QtCore import *
from PyQt4.QtGui import *
class FocusButton(QPushButton):
def __init__(self, parent=None):
super(FocusButton, self).__init__(parent)
tabSignal = pyqtSignal()
def focusInEvent(self, QFocusEvent):
self.emit(SIGNAL('tabSignal()'))
现在可以创建 FocusButton 对象而不是 QPushButton,并且每当获得焦点时它们都会发出 tabSignal。