2014-12-12 3 views
2

저는 PyQt를 사용하여 앱을 설계하고 있습니다. 접근성을 위해 버튼 키를 사용하여 강조 표시된 버튼의 이름을 말하고 싶습니다.QPushButton 탭 하이라이트 신호

나는 Windows Speech API를 사용하여 괜찮은 연설을했습니다. 이제 신호와 슬롯을 사용하고 싶지만 QPushButton에는 강조 표시된 신호가없는 것 같습니다. 내가 찾은 것들은 클릭, 파괴, 누름, 해제, 토글 됨. 그들 중 누구도 일하지 않습니다.

단추가 탭으로 강조 표시 될 때 방출 될 사용자 지정 신호를 설정하는 방법이 있습니까? 당신이 focusChanged 신호에 연결할 수 있도록

답변

1

QApplication는, 위젯 집중 관리를 담당 :

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... 

또한 현재 사용하여 초점이 위젯 얻을 수 있습니다 :

,536을
widget = QtGui.qApp.focusWidget() 
+0

현재 매력적으로 작동하지만 포커스가 기본 창의 하위 페이지로 이동하면 작동합니까? 예를 들어 QHBox에는 중앙 위젯이 있는데, 자식으로 두 개의 QVBox 레이아웃이 있으며, 각각에는 일련의 버튼/lineEdits가 있습니다. 따라서 포커스가 가장 낮은 레벨의 위젯 중 하나로 이동하면 신호가이를 전달합니까, 아니면 조상입니까? – hoodakaushal

+1

응용 프로그램은 현재 활성 창의 포커스 체인에있는 * 모든 * 위젯을 관리합니다. 'focusChanged' 신호는 활성 윈도우가 바뀌었을 때도 나올 것입니다. 그러나 어떤 윈도우가 포커스를 잃고 있는지에 따라'old' 또는'new' 중 하나가'None'으로 설정 될 것입니다. – ekhumoro

0

@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을 방출합니다.