Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 关闭事件不称为键盘事件和MessageBox_Python_Pyqt_Pyqt5_Qt Designer_Qdialog - Fatal编程技术网

Python 关闭事件不称为键盘事件和MessageBox

Python 关闭事件不称为键盘事件和MessageBox,python,pyqt,pyqt5,qt-designer,qdialog,Python,Pyqt,Pyqt5,Qt Designer,Qdialog,我使用QT Designer进行GUI编程,并希望使用ESC键禁用关闭事件。用户可以使用顶部的X关闭应用程序,但不能使用任何键 功能关闭事件(self,event)不工作 def closeEvent(self, event): close = QMessageBox() close.setText("You sure?") close.setStandardButtons(QMessageBox.Yes | QMessageBox.Cancel) close =

我使用QT Designer进行GUI编程,并希望使用ESC键禁用关闭事件。用户可以使用顶部的X关闭应用程序,但不能使用任何键

功能关闭事件(self,event)不工作

def closeEvent(self, event):
    close = QMessageBox()
    close.setText("You sure?")
    close.setStandardButtons(QMessageBox.Yes | QMessageBox.Cancel)
    close = close.exec()

    if close == QMessageBox.Yes:
        event.accept()
    else:
        event.ignore()
该函数位于我的主类上:类Ui\u工具(对象)

这是我的主要职责:

if __name__ == "__main__":

    import sys
    app = QtWidgets.QApplication(sys.argv)
    Tool = QtWidgets.QDialog()
    ui = Ui_Tool()
    ui.setupUi(Tool)
    Tool.show()
    sys.exit(app.exec_())
我做错了什么

我添加了以下类:

class Logic(QMainWindow, Ui_Tool):
def __init__(self, *args, **kwargs):
    QMainWindow.__init__(self, *args, **kwargs)
    self.setupUi(self)

def closeEvent(self, event):
    answer = QtWidgets.QMessageBox.question(
        self,
        'Are you sure you want to quit ?',
        'Task is in progress !',
        QtWidgets.QMessageBox.Yes,
        QtWidgets.QMessageBox.No)
    if answer == QtWidgets.QMessageBox.Yes:
        event.accept()
    else:
        event.ignore()
如果进行了审查:

逃生钥匙

如果用户在对话框中按Esc键,则QDialog::reject()将被删除 打电话。这将导致窗口关闭:无法启动关闭事件 忽略

因此,有两种可能的解决方案:

  • 重写keyPressEvent()方法,当您按escape键时,调用close()

  • Override reject()方法对QMessageBox进行验证,并根据它生成其逻辑

  • 除了此实现之外,您还必须在小部件中而不是在Qt Designer(1)生成的类中执行此操作,考虑到上述情况,两种解决方案的实现都是:

    一,

    从PyQt5导入QtCore、QtGui、qtwidget
    类Ui_LabelTool(对象):
    def设置UI(自身、工具):
    Tool.setObjectName(“工具”)
    工具。调整大小(650569)
    工具设置最小尺寸(QtCore.QSize(650569))
    工具设置最大尺寸(QtCore.QSize(650569))
    Tool.setAutoFillBackground(假)
    工具设置已启用(错误)
    # ....
    类LabelTool(qtwidts.QDialog,Ui_LabelTool):
    def uuu init uuu(self,parent=None):
    超级(LabelTool,self)。\uuuu初始化(父级)
    self.setupUi(self)
    def由用户(自身)验证:
    答案=qtwidts.QMessageBox.question(
    自己
    “你确定要退出吗?”,
    “任务正在进行中!”,
    qtwidts.QMessageBox.Yes,
    qtwidts.QMessageBox.No,
    )
    返回答案==QtWidgets.QMessageBox.Yes
    def按键事件(自身,事件):
    如果event.key()==QtCore.Qt.key\u转义:
    self.close()
    其他:
    超级(LabelTool,自我)。按键事件(事件)
    def关闭事件(自身、事件):
    如果self.verify\u by\u user():
    event.accept()
    其他:
    event.ignore()
    如果名称=“\uuuuu main\uuuuuuuu”:
    导入系统
    app=qtwidts.QApplication(sys.argv)
    w=LabelTool()
    w、 show()
    sys.exit(app.exec_())
    
    二,

    从PyQt5导入QtCore、QtGui、qtwidget
    类Ui_LabelTool(对象):
    def设置UI(自身、工具):
    Tool.setObjectName(“工具”)
    工具。调整大小(650569)
    工具设置最小尺寸(QtCore.QSize(650569))
    工具设置最大尺寸(QtCore.QSize(650569))
    Tool.setAutoFillBackground(假)
    工具设置已启用(错误)
    # ....
    类LabelTool(qtwidts.QDialog,Ui_LabelTool):
    def uuu init uuu(self,parent=None):
    超级(LabelTool,self)。\uuuu初始化(父级)
    self.setupUi(self)
    def由用户(自身)验证:
    答案=qtwidts.QMessageBox.question(
    自己
    “你确定要退出吗?”,
    “任务正在进行中!”,
    qtwidts.QMessageBox.Yes,
    qtwidts.QMessageBox.No,
    )
    返回答案==QtWidgets.QMessageBox.Yes
    def拒绝(自我):
    如果self.verify\u by\u user():
    super(LabelTool,self).reject()
    def关闭事件(自身、事件):
    如果self.verify\u by\u user():
    event.accept()
    其他:
    event.ignore()
    如果名称=“\uuuuu main\uuuuuuuu”:
    导入系统
    app=qtwidts.QApplication(sys.argv)
    w=LabelTool()
    w、 show()
    sys.exit(app.exec_())
    


    (1)

    非常感谢。但是逻辑类的实现不起作用。我必须更改主函数的任何内容吗??你是说在类逻辑中??我这样做,但不起作用。。我读了你的解释如果名字=“\uuuuu main”:不,我什么也没改。这是我的问题,如果有什么改变吗?app=qtwidts.QApplication(sys.argv)LabelTool=qtwidts.QDialog()ui=ui\u LabelTool()ui.setupUi(LabelTool)#LabelTool.show()w=Logic()w.show()sys.exit(app.exec#())但不起作用..然后我出现了一个错误:没有定义名称“Tool”:在类UI\u Tool*中**function\u init\u self.setupUi(LabelTool)
    class Logic(QMainWindow, Ui_Tool):
    def __init__(self, *args, **kwargs):
        QMainWindow.__init__(self, *args, **kwargs)
        self.setupUi(self)
    
    def closeEvent(self, event):
        answer = QtWidgets.QMessageBox.question(
            self,
            'Are you sure you want to quit ?',
            'Task is in progress !',
            QtWidgets.QMessageBox.Yes,
            QtWidgets.QMessageBox.No)
        if answer == QtWidgets.QMessageBox.Yes:
            event.accept()
        else:
            event.ignore()