2016-11-16 2 views
1

В настоящее время я изучаю, как создать приложение с pyqt5, и столкнулся с некоторой проблемой с методом closeEvent, переопределив, поэтому пользователю будет предложено подтвердить объект QMessageBox. Кажется, что хорошо работает с кнопкой X - событие становится «принятым», когда действие подтверждено и «отменено», когда нажата кнопка отмены. Однако, когда я использую кнопку «Выход» из раскрывающегося меню «Файл», независимо от того, какую кнопку я нажимаю, программа закрывается с кодом выхода 1. Кажется странным, потому что я использую тот же метод closeEvent в обоих случаях.PyQt5 closeEvent метод

import sys 

from PyQt5.QtWidgets import QApplication, QMessageBox, QMainWindow, QAction 


class window(QMainWindow): 
    def __init__(self): 

     super().__init__() 

    def createUI(self): 


     self.setGeometry(500, 300, 700, 700) 

     self.setWindowTitle("window") 


     quit = QAction("Quit", self) 
     quit.triggered.connect(self.closeEvent) 

     menubar = self.menuBar() 
     fmenu = menubar.addMenu("File") 
     fmenu.addAction(quit) 

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

main = QApplication(sys.argv) 
window = window() 
window.createUI() 
window.show() 
sys.exit(main.exec_()) 

Благодарим за предложения!

+0

Вы запустили его в консоли/терминале? У вас есть сообщение об ошибке. 'AttributeError: объект 'bool' не имеет атрибута 'accept'' – furas

+0

, когда вы нажимаете кнопку, а затем системный вызов вашей функции, но с другим объектом' event', который не имеет 'accept()' и 'ignore()', поэтому вы получаете сообщение об ошибке и программа заканчивается кодом выхода 1. – furas

ответ

2

При нажатии кнопки, то программа вызывает вашу функцию, но с различными event объекта, который не имеет accept() и ignore() так что вы получите сообщение об ошибке и программа завершается с кодом выхода 1.

Вы можете назначить self.close и программа будет вызовите closeEvent() с правильным объектом события.

quit.triggered.connect(self.close) 
Смежные вопросы