Функция PyQT CloseEvent: главное окно исчезает - PullRequest
0 голосов
/ 01 февраля 2019

Я новичок в PyQT.Я переношу одно из своих приложений из tkinter в PyQT.Мне нужен следующий сценарий: когда пользователь нажимает кнопку X, появляется окно сообщения с вопросом, уверен ли пользователь в закрытии, пока главный экран все еще открыт.Тем не менее, в моем коде, когда кнопка X нажата, главный экран сначала исчезает, и появляется окно сообщения.Как я могу решить эту «проблему заказа» - как я звоню?Мой код ниже:

(В 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())

Ответы [ 3 ]

0 голосов
/ 01 февраля 2019

Попробуйте:

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 голосов
/ 05 февраля 2019

Используйте 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())
0 голосов
/ 01 февраля 2019

Вы можете выбрать, принять событие или нет.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...