Я разрабатываю программу управления p-room. Когда пользователь нажимает клавишу «ESC», «диалог» завершается. Я хочу предотвратить это. Итак, я хочу использовать «второй код» в «первом коде».

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()
2
Jinhong Park 20 Авг 2014 в 10:56
Вы должны уточнить. Использование одного кода в другом коде очень расплывчато и не говорит нам, чего вы действительно хотите.
 – 
Trilarion
2 Сен 2014 в 13:14

1 ответ

Лучший ответ

Простой способ использования сочетания клавиш - использовать 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)
9
TylerH 27 Дек 2016 в 22:42
Большое спасибо. но я хочу использовать «второй код» в «первом коде» еще один анализ, пожалуйста.
 – 
Jinhong Park
20 Авг 2014 в 13:59
Хмм ???? Вы хотите поместить QtGui.QMainWindow в QtGui.QDialog? Это невозможно.
 – 
Kitsune Meyoko
20 Авг 2014 в 14:18
Кстати. действительно ли возможно поместить QMainWindow в QDialog? Я думаю, это должно работать, только тогда веди себя немного по-другому.
 – 
Trilarion
2 Сен 2014 в 13:12
На самом деле можно, но он не предлагает QMainWindow для неиспользования в основном виджете. Класс QMainWindow управляет главным окном. Так что я НЕ рекомендую это делать.
 – 
Kitsune Meyoko
2 Сен 2014 в 13:20
В конце ссылки на класс QKeySequence отсутствует буква "l".
 – 
kkpattern
8 Окт 2015 в 11:24