私のアプリケーションで矢印キーのキーイベントを処理したい。私はすでにそれを読んでいるので、焦点は無効にする必要があります。私はこの方法に従う: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