2016-10-01 13 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

関連する問題