PyQt的功能的closeEvent:主窗口中消失

问题描述 投票:0回答:3

我是新来的PyQt。我将我的应用程序之一,从Tkinter的到PyQt的。我要的是以下情形:当用户点击X按钮,在MessageBox询问用户是否是肯定收,而主屏幕仍处于打开状态将出现。然而,在我的代码,X按钮被点击时,主屏幕上消失第一和消息框出现。我该如何解决这个“治安问题” -as我打电话?我的代码如下:

(在Tkinter的,这是很容易的代码root.protocol("WM_DELETE_WINDOW", on_closing)和含on_closing功能messagebox.askokcancel("Quit", "Do you want to quit Chit-Chat?")命令。但是,我不能完全弄清楚在PyQt的。)

app = QApplication(sys.argv)

v_box = QVBoxLayout()

window = QWidget()
label = QLabel("Hello World")

v_box.addWidget(label)

def closeEvent():
    msg_box = QMessageBox()
choice = QMessageBox.question(msg_box, "Quit", "Do you want to quit chit chat?", QMessageBox.Yes | QMessageBox.No)
    if choice == QMessageBox.Yes:
        print("The program was shut down.")
        sys.exit()
    else:
        pass

app.aboutToQuit.connect(closeEvent)
window.setLayout(v_box)
window.show()
sys.exit(app.exec())
python user-interface pyqt
3个回答
0
投票

试试吧:

import sys
from PyQt5.QtGui     import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore    import *

class Window(QWidget):
    def __init__(self, parent=None):
        super().__init__(parent)

        label = QLabel("Hello World")

        v_box = QVBoxLayout()
        v_box.addWidget(label)
        self.setLayout(v_box)

    def closeEvent(self, event):
        choice = QMessageBox.question(
            self,  
            "Quit", 
            "Do you want to quit chit chat?", 
            QMessageBox.Yes | QMessageBox.No)

        if choice == QMessageBox.Yes:
            print("The program was shut down.")
            event.accept()
        else:
            event.ignore()

if __name__ == '__main__':
    app = QApplication(sys.argv)
    qt_app = Window()
    qt_app.show()
    sys.exit(app.exec_())

enter image description here


0
投票

您可以选择是否接受该事件与否。

def closeEvent(self, event):
    if self.popup_question():
        print("The program was shut down.")
        event.accept()
    else:
        print("not exiting")
        event.ignore()

def popup_question(self):
    """Generate a popup that requests if you want to do something or not."""
    msgbox = QtWidgets.QMessageBox()
    msgbox.setWindowTitle("Whatever title you want to add.")
    msgbox.setIcon(QtWidgets.QMessageBox.Warning)
    msgbox.setText("Do you want to quit chit chat?")
    botonyes = QtWidgets.QPushButton("Yes")
    msgbox.addButton(botonyes, QtWidgets.QMessageBox.YesRole)
    botonno = QtWidgets.QPushButton("No")
    msgbox.addButton(botonno, QtWidgets.QMessageBox.NoRole)
    msgbox.exec_()
    if msgbox.clickedButton() == botonno:
        return False
    else:
        return True

0
投票

使用functools来覆盖你的窗口部件closeEvent而无需创建一个子类,然后接受或使用event.accept()event.ignore()取消关闭事件:

import functools
import sys
from PyQt5.QtWidgets import QApplication, QVBoxLayout, QWidget, QLabel, QMessageBox


def closeEvent(self, event):
    choice = QMessageBox.question(self, "Quit", "Do you want to quit chit chat?", QMessageBox.Yes | QMessageBox.No)
    if choice == QMessageBox.Yes:
        event.accept()
    else:
        event.ignore()


app = QApplication(sys.argv)

v_box = QVBoxLayout()

window = QWidget()

window.closeEvent = functools.partial(closeEvent, window)

label = QLabel("Hello World")

v_box.addWidget(label)

window.setLayout(v_box)
window.show()
sys.exit(app.exec())
© www.soinside.com 2019 - 2024. All rights reserved.