gpt4 book ai didi

python - pyqt5 - 关闭/终止应用程序

转载 作者:太空狗 更新时间:2023-10-30 01:00:14 24 4
gpt4 key购买 nike

我正在通过此处找到的 pyqt5 教程工作 Zetcode, PyQt5

作为我自己的练习,我尝试扩展一个示例,以便无论使用何种方法关闭应用程序,我都会看到相同的对话框消息框:

  • 单击标题栏中的“X”按钮(按预期工作)
  • 单击“关闭”按钮(产生属性错误)
  • 按“转义”键(有效但不确定如何/为什么)

对话框消息框在 closeEvent 方法中实现,最后提供了完整的脚本。

我有两个问题:

<强>1。单击“关闭”按钮时,我想调用包括消息框对话框在内的 closeEvent 方法,而不仅仅是退出。

我已经为“关闭”按钮替换了一行示例代码:

btn.clicked.connect(QCoreApplication.instance().quit)

相反,我尝试调用已经实现了我想要的对话框的 closeEvent 方法:

btn.clicked.connect(self.closeEvent)

但是,当我运行脚本并单击“关闭”按钮并在对话框中选择生成的“关闭”选项时,我得到以下信息:

Traceback (most recent call last):
File "5-terminator.py", line 41, in closeEvent
event.accept()
AttributeError: 'bool' object has no attribute 'accept'
Aborted

谁能告诉我哪里做错了以及这里需要做什么?

<强>2。当以某种方式按下转义键时,会显示消息框对话框并且工作正常。

好的,它的工作原理很棒,但我想知道如何以及为什么在 keyPressEvent 方法中调用 CloseEvent 方法中定义的消息框功能。

完整脚本如下:

import sys
from PyQt5.QtWidgets import (
QApplication, QWidget, QToolTip, QPushButton, QMessageBox)
from PyQt5.QtCore import QCoreApplication, Qt


class Window(QWidget):

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

self.initUI()

def initUI(self):

btn = QPushButton("Close", self)
btn.setToolTip("Close Application")
# btn.clicked.connect(QCoreApplication.instance().quit)
# instead of above button signal, try to call closeEvent method below
btn.clicked.connect(self.closeEvent)

btn.resize(btn.sizeHint())
btn.move(410, 118)
self.setGeometry(30, 450, 500, 150)
self.setWindowTitle("Terminator")
self.show()

def closeEvent(self, event):
"""Generate 'question' dialog on clicking 'X' button in title bar.

Reimplement the closeEvent() event handler to include a 'Question'
dialog with options on how to proceed - Save, Close, Cancel buttons
"""
reply = QMessageBox.question(
self, "Message",
"Are you sure you want to quit? Any unsaved work will be lost.",
QMessageBox.Save | QMessageBox.Close | QMessageBox.Cancel,
QMessageBox.Save)

if reply == QMessageBox.Close:
event.accept()
else:
event.ignore()

def keyPressEvent(self, event):
"""Close application from escape key.

results in QMessageBox dialog from closeEvent, good but how/why?
"""
if event.key() == Qt.Key_Escape:
self.close()

if __name__ == '__main__':

app = QApplication(sys.argv)
w = Window()
sys.exit(app.exec_())

希望有人能抽空赐教。

最佳答案

你的第二个问题回答了第一个问题。

重新实现的 keyPressEvent 方法调用 close() ,它向小部件发送一个 QCloseEvent。随后,小部件的 closeEvent将以该事件作为参数调用。

因此您只需将按钮连接到小部件的 close() 插槽,一切都会按预期工作:

    btn.clicked.connect(self.close)

关于python - pyqt5 - 关闭/终止应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36555153/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com