2014-12-12 3 views
2

Я использую PyQt для разработки приложения. По причинам доступности я хочу указать имя кнопки, когда она подсвечена (с помощью навигации по клавише табуляции).Сигнал выделения вкладки QPushButton

У меня есть речь в порядке с помощью Windows Speech API. Теперь я хочу использовать сигналы и слоты, но QPushButton, похоже, не имеет сигнала, когда он подсвечивается. Найденные мной щелкнули, уничтожили, нажали, выпустили, переключили. Ни один из них не работает.

Есть ли способ настроить пользовательский сигнал, который будет излучаться, когда кнопка будет выделена вкладкой?

ответ

1

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() 
+0

На данный момент работает как шарм, но будет ли он работать, если фокус переходит к ребенку ребенка в главном окне? Например, у меня есть QHBox в качестве центрального виджета, в котором есть два макета QVBox как дети, каждый из которых имеет в себе кучу кнопок/lineEdits. Итак, если фокус переходит к одному из виджета самого низкого уровня, будет ли сигнал проходить или предком? – hoodakaushal

+1

Приложение управляет * all * виджетами в цепочке фокусов текущего активного окна. Сигнал 'focusChanged' также будет выходить, когда активное окно изменится, но либо из« старого », либо« нового »будет установлено значение« Нет », в зависимости от того, какое окно проигрывает или получает фокус. – 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 всякий раз, когда они получают фокус.