KeyPressEvent () не работает с меткой при добавлении кнопок - PullRequest
1 голос
/ 05 ноября 2019

`

from PyQt5.QtCore import Qt
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow
from PyQt5.QtWidgets import QLabel, QPushButton


class Example(QMainWindow):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.setGeometry(300, 300, 1000, 1000)
        self.setWindowTitle('Example')

        self.label_backround = QLabel(self)
        self.label_backround.move(100, 100)
        self.label_backround.resize(800, 800)

        self.label = QLabel(self)
        self.label.setText("xxxxx")
        self.label.move(340, 340)

        self.Button1 = QPushButton('1', self)
        self.Button1.move(580, 250)

        self.Button2 = QPushButton('2', self)
        self.Button2.move(590, 560)

        self.Button3 = QPushButton('3', self)
        self.Button3.move(210, 660)

    def keyPressEvent(self, event):
        x = self.label.x()
        y = self.label.y()
        if event.key() == Qt.Key_Left:
            self.label.move(x - 15, y)
        elif event.key() == Qt.Key_Up:
            self.label.move(x, y - 15)
        elif event.key() == Qt.Key_Right:
            self.label.move(x + 15, y)
        elif event.key() == Qt.Key_Down:
            self.label.move(x, y + 15)


app = QApplication(sys.argv)
ex = Example()
ex.show()
sys.exit(app.exec_())

` У меня есть окно с надписью, которая должна двигаться, когда я нажимаю кнопки вверх, вниз, вправо и влево на клавиатуре. Это работает, но когда я добавляю несколько кнопок, метка не перемещается.

Может кто-нибудь знает, о чем идет речь?

1 Ответ

1 голос
/ 06 ноября 2019

Виджет, который получает событие нажатия клавиши, только виджет, имеющий фокус, и по умолчанию многие виджеты, такие как QPushButtons, получают фокус в отличие от QWidget. В этом случае вы не должны использовать keyPressEvent, но QShorcut, который позволяет вам захватывать события клавиатуры независимо от виджетов (очевидно, вы можете устанавливать ограничения через контекст). Учитывая вышеизложенное, решение выглядит так:

import sys

from PyQt5.QtCore import QPoint, Qt
from PyQt5.QtGui import QKeySequence
from PyQt5.QtWidgets import QApplication, QLabel, QMainWindow, QPushButton, QShortcut


class Example(QMainWindow):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.setGeometry(300, 300, 1000, 1000)
        self.setWindowTitle("Example")

        self.label_backround = QLabel(self)
        self.label_backround.move(100, 100)
        self.label_backround.resize(800, 800)

        self.label = QLabel(self)
        self.label.setText("xxxxx")
        self.label.move(340, 340)

        self.Button1 = QPushButton("1", self)
        self.Button1.move(580, 250)

        self.Button2 = QPushButton("2", self)
        self.Button2.move(590, 560)

        self.Button3 = QPushButton("3", self)
        self.Button3.move(210, 660)

        QShortcut(QKeySequence(Qt.Key_Left), self, activated=self.move_left)
        QShortcut(QKeySequence(Qt.Key_Up), self, activated=self.move_up)
        QShortcut(QKeySequence(Qt.Key_Right), self, activated=self.move_right)
        QShortcut(QKeySequence(Qt.Key_Down), self, activated=self.move_down)

    def move_left(self):
        self.label.move(self.label.pos() + QPoint(-15, 0))

    def move_up(self):
        self.label.move(self.label.pos() + QPoint(0, -15))

    def move_right(self):
        self.label.move(self.label.pos() + QPoint(15, 0))

    def move_down(self):
        self.label.move(self.label.pos() + QPoint(0, 15))


if __name__ == "__main__":
    app = QApplication(sys.argv)
    ex = Example()
    ex.show()
    sys.exit(app.exec_())
...