2016-10-01 3 views
1

내 응용 프로그램에서 화살표 키의 키 이벤트를 처리하려고합니다. 나는 그것을하기 위해 이미 읽었으므로 초점을 무력화해야합니다. 나는이 방법을 따른다 : PyQt not recognizing arrow keys. 실제로, self.setChildrenFocusPolicy(QtCore.Qt.NoFocus) (링크 된 스레드 및 아래 소스 코드에 정의 된대로)을 MyApp.__init__ 내에 호출하면 화살표 키를 치면 키 이벤트가 발생합니다. 그러나 버튼을 클릭 할 때만 응용 프로그램의 전체 런타임 중에 초점을 유지하지 않으려합니다. 그래서 버튼 클릭 기능에 self.setChildrenFocusPolicy(QtCore.Qt.NoFocus) 이동 :포커스 정책을 설정하여 화살표 키 이벤트 처리

def __init__(self): 
    self.pushButton.clicked.connect(self.pushButtonClicked) 

def pushButtonClicked(self): 
    self.setChildrenFocusPolicy(QtCore.Qt.NoFocus) 

가 실제로 푸시 버튼을 눌렀을하여 초점을 (예를 들어, 라인 편집은 더 이상 텍스트 커서를받을 수 없어) 사용할 수 없습니다. 그러나 화살표 키를 눌러도 키 이벤트가 발생하지 않습니다.

전체 응용 프로그램 (당신은 푸시 버튼으로 mainwindow.ui가 필요합니다) :

import sys 
from PyQt4 import QtCore, QtGui, uic 

qtCreatorFile = "d:/test/mainwindow.ui" 

Ui_MainWindow, QtBaseClass = uic.loadUiType(qtCreatorFile) 

class MyApp(QtGui.QMainWindow, Ui_MainWindow): 

    def setChildrenFocusPolicy(self, policy): 
     def recursiveSetChildFocusPolicy (parentQWidget): 
      for childQWidget in parentQWidget.findChildren(QtGui.QWidget): 
       childQWidget.setFocusPolicy(policy) 
       recursiveSetChildFocusPolicy(childQWidget) 
     recursiveSetChildFocusPolicy(self) 

    def __init__(self): 
     QtGui.QMainWindow.__init__(self) 
     Ui_MainWindow.__init__(self) 
     self.setupUi(self) 
     self.pushButton.clicked.connect(self.pushButtonClicked) 

    def pushButtonClicked(self): 
     self.setChildrenFocusPolicy(QtCore.Qt.NoFocus) 

    def keyPressEvent(self, event): 
     print "a" 

if __name__ == "__main__": 
    app = QtGui.QApplication(sys.argv) 
    window = MyApp() 
    window.show() 
    sys.exit(app.exec_()) 

답변

1

초점을 해제 할 필요가 없습니다. 당신이 더 많은 끝낼 수 있도록 흥정 않고, 정말 모든를 얻을 않는다는 것을

class MyApp(QtGui.QMainWindow, Ui_MainWindow): 
    def __init__(self): 
     ... 
     QtGui.qApp.installEventFilter(self) 

    def eventFilter(self, source, event): 
     if event.type() == QtCore.QEvent.KeyPress: 
      print(event.key()) 
     return super(MyApp, self).eventFilter(source, event) 

그러나주의 ...

을 : 당신은 응용 프로그램에 이벤트 필터를 설치하여 모든 키 이벤트에 액세스 할 수 있습니다
+0

이것은 작동합니다. 다른 스레드에서 언급 된 메서드가'__init__' 함수 내에서만 작동하지만 나중에는 작동하지 않는 이유를 알고 있습니까? –

+0

@MichaelWestwort. 실제로, 나는 그것을하기 위해 노력하고있는 것을 이해하기 위해 그 대답에있는 모든 코드를 샅샅이 뒤질 필요가 없다고 생각합니다 ;-) 왜 당신은 알 필요가 있습니까? – ekhumoro