1

PyQt4 でのイベント処理について学習しようとしてい keyPressEventますが、クラス定義を変更した後、矢印キー以外のすべてのキーが表示されるケースに遭遇しました。

すべてのキーを見てから:

class MaskWindow(QtGui.QGraphicsView):
    def __init__(self):
        QtGui.QGraphicsView.__init__(self)

        self.deskTop = QtGui.QDesktopWidget()
        self.scene = QtGui.QGraphicsScene(self)

矢印キー、ページダウンとアップを表示できませんが、他のキーは機能します (例: Tab, Shift, a- ) z:

class MaskWindow(QtGui.QMainWindow):
    def __init__(self):
        QtGui.QMainWindow.__init__(self, None, QtCore.Qt.WindowStaysOnTopHint|
                                   QtCore.Qt.FramelessWindowHint)            

        self.deskTop = QtGui.QDesktopWidget()
        self.view = QtGui.QGraphicsView(self)
        self.scene = QtGui.QGraphicsScene(self)

矢印キーがトラップされなくなったキー ハンドラーを次に示します。

def keyPressEvent(self, event):
    key = event.key()
    if key == QtCore.Qt.UpArrow
        self.diameter += 1
    if key == QtCore.Qt.DownArrow:
        self.diameter -= 1

クラスチェンジで何が足りなかったの?

4

1 に答える 1

3

再実装keyPressEventされた関数は、間違った列挙定数を使用しています。

QtCore.Qt.Key列挙を使用する必要があります。

def keyPressEvent(self, event):
    key = event.key()
    if key == QtCore.Qt.Key_Up:
        self.diameter += 1
    if key == QtCore.Qt.Key_Down:
        self.diameter -= 1

また、関数を使用して、任意のウィジェット ( を含むQGraphicsView)でウィンドウ フラグを変更できます。setWidowFlags

class MaskWindow(QtGui.QGraphicsView):
    def __init__(self):
        QtGui.QGraphicsView.__init__(self)
        self.setWindowFlags(self.windowFlags() |
            QtCore.Qt.WindowStaysOnTopHint |
            QtCore.Qt.FramelessWindowHint)

アップデート

keyPressEventあなたの例で再実装されたものが機能しない理由はQMainWindow、キーイベントを取得できなくなるためです。代わりに、キーボードフォーカスのある子ウィジェットに移動します。

これを回避する 1 つの方法は、event filterキー イベントを取得するウィジェットにを設定することです。

class MaskWindow(QtGui.QMainWindow):
    def __init__(self):
        QtGui.QMainWindow.__init__(self, None,
            QtCore.Qt.WindowStaysOnTopHint |
            QtCore.Qt.FramelessWindowHint)
        self.view = QtGui.QGraphicsView(self)
        self.view.installEventFilter(self)
        self.setCentralWidget(self.view)

    def eventFilter(self, source, event):
        if (source is self.view and
            event.type() == QtCore.QEvent.KeyPress):
            key = event.key()
            if key == QtCore.Qt.Key_Up:
                self.diameter += 1
            elif key == QtCore.Qt.Key_Down:
                self.diameter -= 1
        return QtGui.QMainWindow.eventFilter(self, source, event)
于 2012-09-04T21:59:50.183 に答える