我想在PyQt4的代码中使用键盘快捷键

时间:2014-08-20 06:56:21

标签: python python-2.7 pyqt pyqt4 keyboard-shortcuts

我正在开发一个p-room管理程序。当用户按下" ESC" key," Dialog"被终止。我想阻止这个。所以,我想使用第二个代码'在第一个代码'

from PyQt4 import QtCore, QtGui

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_Dialog(object):
    def setupUi(self, Dialog):
        self.Dialog = Dialog
        self.Dialog.setObjectName(_fromUtf8("self.Dialog"))
        self.Dialog.resize(190, 98)
        self.pushButton = QtGui.QPushButton(self.Dialog)
        self.pushButton.setGeometry(QtCore.QRect(0, 0, 191, 101))
        font = QtGui.QFont()
        font.setPointSize(13)
        self.pushButton.setFont(font)
        self.pushButton.setObjectName(_fromUtf8("pushButton"))
        self.retranslateUi(self.Dialog)
        QtCore.QMetaObject.connectSlotsByName(self.Dialog)
        QtCore.QObject.connect(self.pushButton, QtCore.SIGNAL('released()'), self.Dialog.close) # <- put signal to close when clicked.

    def retranslateUi(self, Dialog):
        self.Dialog.setWindowTitle(_translate("self.Dialog", "self.Dialog", None))
        self.pushButton.setText(_translate("self.Dialog", "hi", None))

class QCustomDialog (QtGui.QDialog): # <- Implement your own
    def closeEvent(self, event):
        reply = QtGui.QMessageBox.question(self, 'Message',
            "Are you sure to quit?", QtGui.QMessageBox.Yes | 
            QtGui.QMessageBox.No, QtGui.QMessageBox.No)
        if reply == QtGui.QMessageBox.Yes:
            event.accept()
        else:
            event.ignore()

if __name__ == "__main__":
    import sys
    app = QtGui.QApplication(sys.argv)
    Dialog = QCustomDialog()
    ui = Ui_Dialog()
    ui.setupUi(Dialog)
    Dialog.show()
    sys.exit(app.exec_())

from PyQt4.Qt import Qt 
from PyQt4 import QtCore, QtGui
from PyQt4.QtCore import QObject, SIGNAL 
from PyQt4.QtGui import QWidget, QApplication, QMainWindow, QAction, QIcon, QKeySequence 
import os, time, MySQLdb, socket, sys


class MainWindow(QMainWindow): 
    def __init__(self, parent): 
        QMainWindow.__init__(self, parent) 
        self.centralwidget = QWidget(self) 

        self.action = QAction(QIcon(), "Down", self) 
        self.action.setShortcut("ESC") 
        self.action.setShortcutContext(Qt.ApplicationShortcut)
        self.addAction(self.action) 

        QObject.connect(self.action, SIGNAL("triggered()"), self.down) 

    def down(self): 
        print 'DOWN!!!' 

def main(): 
    app = QApplication(sys.argv) 
    mw = MainWindow(None) 
    mw.show() 
    sys.exit(app.exec_()) 

if __name__ == '__main__': 
    main()

1 个答案:

答案 0 :(得分:8)

使用键盘快捷键的简便方法是使用QShortcut中的键序列来使用QKeySequence

class MainWindow (QtGui.QMainWindow): 
    def __init__ (self, parent = None): 
        QtGui.QMainWindow.__init__(self, parent)
        .
        .
        .
        self.myQCustomDialog = QCustomDialog() # <- From code 1
        ui = Ui_Dialog()                       # <- From code 1
        ui.setupUi(self.myQCustomDialog)       # <- From code 1
        self.setCentralWidget(self.myQCustomDialog) # <- Set to this central widget
        .
        .
        .
        self.connect(QtGui.QShortcut(QtGui.QKeySequence(QtCore.Qt.Key_Escape), self), QtCore.SIGNAL('activated()'), self.down)

def down(self): 
    print 'DOWN!!!'
    # Or put code to implement from code 1

QShortcut上课:http://pyqt.sourceforge.net/Docs/PyQt4/qshortcut.html

QKeySequence上课:http://pyqt.sourceforge.net/Docs/PyQt4/qkeysequence.html

Qt.Key参考:http://pyqt.sourceforge.net/Docs/PyQt4/qt.html


实现上述代码的另一种方式,这个例子展示了如何在对话框中实现:

class Ui_Dialog(object):
    def setupUi(self, Dialog):
        .
        .
        .
        QtCore.QObject.connect(QtGui.QShortcut(QtGui.QKeySequence(QtCore.Qt.Key_Escape), self.Dialog), QtCore.SIGNAL('activated()'), self.Dialog.close)