내 응용 프로그램에서 화살표 키의 키 이벤트를 처리하려고합니다. 나는 그것을하기 위해 이미 읽었으므로 초점을 무력화해야합니다. 나는이 방법을 따른다 : 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_())
이것은 작동합니다. 다른 스레드에서 언급 된 메서드가'__init__' 함수 내에서만 작동하지만 나중에는 작동하지 않는 이유를 알고 있습니까? –
@MichaelWestwort. 실제로, 나는 그것을하기 위해 노력하고있는 것을 이해하기 위해 그 대답에있는 모든 코드를 샅샅이 뒤질 필요가 없다고 생각합니다 ;-) 왜 당신은 알 필요가 있습니까? – ekhumoro