如何使这个PyQt5字符在箭头键输入时移动?

2024-05-11 23:36:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在制作一个简单的PyQt5应用程序,我很好奇如何使用箭头键移动圆。我要它在每次按下时移动5个像素。在

from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(500, 500)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.coords = QtWidgets.QPushButton(self.centralwidget)
        self.coords.setGeometry(QtCore.QRect(0, 0, 75, 23))
        self.coords.setObjectName("coords")
        self.mover = QtWidgets.QLabel(self.centralwidget)
        self.mover.setGeometry(QtCore.QRect(200, 200, 50, 50))
        self.mover.setText("")
        self.mover.setPixmap(QtGui.QPixmap("mover.png"))
        self.mover.setObjectName("mover")
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 500, 21))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "DYM"))
        self.coords.setText(_translate("MainWindow", "Coords"))


if __name__ == "__main__":
     # Snip

Tags: selfcoordspyqt5translatemoverqtguistatusbarqtcore
1条回答
网友
1楼 · 发布于 2024-05-11 23:36:45

您不应该直接从设计器文件中编辑或使用pyuic提供的代码。 相反,您必须创建自己的代码,使用所解释的代码here。在

一个非常简单且有限的实现(不使用Designer.ui文件)如下所示:

import sys
from PyQt5 import QtCore, QtGui, QtWidgets

class Mover(QtWidgets.QLabel):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.setGeometry(0, 0, 500, 21)
        self.setPixmap(QtGui.QPixmap('mover.png'))

    def keyPressEvent(self, event):
        if event.key() == QtCore.Qt.Key_Up:
            self.move(self.x(), self.y() - 5)
        elif event.key() == QtCore.Qt.Key_Down:
            self.move(self.x(), self.y() + 5)
        elif event.key() == QtCore.Qt.Key_Left:
            self.move(self.x() - 5, self.y())
        elif event.key() == QtCore.Qt.Key_Right:
            self.move(self.x() + 5, self.y())
        else:
            QtWidgets.QLabel.keyPressEvent(self, event)


class MainWindow(QtWidgets.QMainWindow):
    def __init__(self):
        QtWidgets.QMainWindow.__init__(self)
        centralWidget = QtWidgets.QWidget()
        self.setCentralWidget(centralWidget)
        self.mover = Mover(centralWidget)
        self.mover.setFocus()


if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())

不过,这也有一些缺点:我必须setFocus来捕获按键事件,这意味着如果有任何其他小部件与按键事件交互(例如QLineEdit),并且它获得了焦点,您的“mover”小部件将不会再移动,直到它接收到焦点(这通常是通过^{})来实现的。在

相关问题 更多 >