【问题标题】:Detecting Keyboard Events in PyQt4在 PyQt4 中检测键盘事件
【发布时间】:2017-04-06 02:17:23
【问题描述】:

我正在制作一个包含几个 UI 的项目,我想在最后一个 UI 中捕捉键盘事件并播放一些音乐。我已经展示了下面的代码:

import sys
from PyQt4 import QtGui, QtCore
from pygame import mixer

class Example(QtGui.QWidget):

    def __init__(self):
        super(Example, self).__init__()

        self.initUI()

    def initUI(self):

        self.setGeometry(300,300,250,150)
        self.setWindowTitle('Event handler')

    def keyPressEvent(self, e):

        if e.key() == QtCore.Qt.Key_W:
            mixer.init()
            mixer.music.load(r'C:\Users\qodud\Desktop\computingwork\bookA_Music\bookA_Music_W.mp3')
            mixer.music.stop()    

def main():

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

if __name__ == '__main__':
    main()`

我有代码来定义 UI 类:

from PyQt4 import QtCore, QtGui
from pygame import mixer

try:
    _fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
    def _fromUtf8(s):
        return s

try:
    _encoding = QtGui.QApplication.UnicodeUTF8
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig, _encoding)
except AttributeError:
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig)

class Ui_bookA(QtGui.QWidget):
    def setupUi(self, bookA):
        bookA.setObjectName(_fromUtf8("bookA"))
        bookA.resize(400, 300)
        self.listWidget = QtGui.QListWidget(bookA)
        self.listWidget.setGeometry(QtCore.QRect(20, 20, 260, 260))
        self.listWidget.setObjectName(_fromUtf8("listWidget"))
        item = QtGui.QListWidgetItem()
        self.listWidget.addItem(item)
        self.backButton = QtGui.QPushButton(bookA)
        self.backButton.setGeometry(QtCore.QRect(300, 220, 80, 20))
        self.backButton.setObjectName(_fromUtf8("backButton"))
        self.pauseButton = QtGui.QPushButton(bookA)
        self.pauseButton.setGeometry(QtCore.QRect(300, 250, 80, 20))
        self.pauseButton.setObjectName(_fromUtf8("pauseButton"))

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

    def retranslateUi(self, bookA):
        bookA.setWindowTitle(_translate("bookA", "bookA", None))
        self.backButton.setText(_translate("bookA", "Back", None))
        self.pauseButton.setText(_translate("bookA", "Pause", None))
        __sortingEnabled = self.listWidget.isSortingEnabled()
        self.listWidget.setSortingEnabled(False)
        item = self.listWidget.item(0)
        item.setText(_translate("Form", "저자 P.15 사랑하는 이들에게 - 정재형    \n"
"\n"
"욕심 P.66 1997 Spring - Yoshimata Ryo\n"
"\n"
"편지 P.79 River Flows In You - 이루마\n"
"\n"
"낭만 실조 P.80 Kiss the Rain - 이루마\n"
"\n"
"어떤 날 P.89 History -Yoshimata Ryo\n"
"\n"
"빈 소원 P.100 The Whole Nine Yards -Yoshimata Ryo", None))
        self.listWidget.setSortingEnabled(__sortingEnabled)

    def keyPressEvent(self,e):

        if e.key() == QtCore.Qt.Key_W :
            mixer.init()
            mixer.music.load(r'C:\Users\qodud\Desktop\computingwork\bookA_Music\bookA_Music_W.mp3')
            mixer.music.play()


if __name__ == "__main__":
    import sys
    app = QtGui.QApplication(sys.argv)
    bookA = QtGui.QWidget()
    ui = Ui_bookA()
    ui.setupUi(bookA)
    bookA.show()
    sys.exit(app.exec_())

最后一个模块导入所有 UI 并在 UI 之间交换信号:

from PyQt4 import QtCore, QtGui
from PyQt4.QtGui import QMainWindow
from PyQt4.QtCore import pyqtSignature
from pygame import mixer
import sys

from first import Ui_First
from mymusicbook import Ui_mymusicBook
from booka import Ui_bookA
from bookb import Ui_bookB
from bookc import Ui_bookC

class First(QMainWindow,Ui_First,QtGui.QWidget):

    def __init__(self, parent = None):
        QMainWindow.__init__(self, parent)
        self.setupUi(self)

        self.popDialog1=mymusicBook()

    def on_startButton_clicked(self):
        self.popDialog1.show()

    def on_exitButton_clicked(self):
        self.close()

class mymusicBook(QMainWindow,Ui_mymusicBook):

    def __init__(self, parent = None):
        QMainWindow.__init__(self,parent)
        self.setupUi(self)

        self.popDialog2=bookA()
        self.popDialog3=bookB()
        self.popDialog4=bookC()

    def on_book_A_Button_clicked(self):
        self.popDialog2.show()


    def on_book_B_Button_clicked(self):
        self.popDialog3.show()

    def on_book_C_Button_clicked(self):
        self.popDialog4.show()

class bookA(QMainWindow,Ui_bookA):

    def __init__(self, parent = None):
        QMainWindow.__init__(self,parent)
        self.setupUi(self)

    def on_backButton_clicked(self):
        self.close()

    def keyPressEvent(self,e):

        if self.e.key() == QtCore.Qt.Key_W :
            mixer.init()
            mixer.music.load(r'C:\Users\qodud\Desktop\computingwork\bookA_Music\bookA_Music_W.mp3')
            mixer.music.stop()

class bookB(QMainWindow,Ui_bookB):

    def __init__(self, parent = None):
        QMainWindow.__init__(self,parent)
        self.setupUi(self)

    def on_backButon_clicked(self):
        self.close()

class bookC(QMainWindow,Ui_bookC):

    def __init__(self,parent=None):
        QMainWindow.__init__(self,parent)
        self.setupUi(self)

    def on_backButton_clicked(self):
        self.close()

我以为我必须在最后一个代码中处理事件,但它不起作用。我必须在哪里定义方法?

【问题讨论】:

  • 我有一个类似的应用程序(敲击键时的音乐)。我强烈建议您转到 pyqt5,因为 pyqt4 不再维护:julien.duponchelle.info/python/migration-from-pyqt4-to-pyqt5 我遇到的麻烦要少得多。我没有解决你的问题,但也许你最好花精力用 pyqt5 解决它而不是 pyqt4...
  • @Wli。 PyQt4 仍然得到全面维护,并且没有停止支持它的计划。
  • 哦,真的吗?我可能是从错误的来源读到的……感谢您纠正我
  • @ekhumoro。谢谢你的修改。我应该多学点英语:)

标签: python python-3.x user-interface pyqt4 keyboard-events


【解决方案1】:
  1. 将处理事件的小部件是当前的“聚焦”小部件。
  2. 您可以在任何地方处理您的 KeyPressEvents。
  3. 您也可以在被覆盖的方法中创建类似QKeyEvent.ignore 的内容,然后其父亲会处理它,等等。
  4. 一个不错的选择是将EventFilter 安装到要捕获事件并在过滤器管理器中处理的对象。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-18
    • 2014-06-22
    • 2016-12-23
    • 1970-01-01
    • 1970-01-01
    • 2015-06-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多