2016-11-16 1 views
1

J'apprends actuellement à compiler une application avec pyqt5 et j'ai rencontré un problème avec la méthode closeEvent, redéfinie pour que l'utilisateur demande confirmation à l'objet QMessageBox. Il semble bien fonctionner avec le bouton X - l'événement est 'accepté' quand l'action est confirmée et 'annulé' quand on clique sur le bouton annuler. Toutefois, lorsque j'utilise mon bouton Quit du menu déroulant Fichier, quel que soit le bouton sur lequel je clique, le programme se ferme avec le code de sortie 1. Cela semble étrange, car j'utilise la même méthode closeEvent dans les deux cas.PyQt5 méthode 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_()) 

Merci pour vos suggestions!

+0

l'avez-vous exécuté dans la console/terminal? Vous avez un message d'erreur. 'AttributeError: l'objet 'bool' n'a pas d'attribut 'accept'' – furas

+0

lorsque vous cliquez sur le bouton alors le système appelle votre fonction mais avec un autre objet' event' qui n'a pas 'accept()' et 'ignore()' de sorte que vous obtenez Le message d'erreur et le programme se terminent par le code de sortie 1. – furas

Répondre

2

Lorsque vous cliquez sur le bouton puis appelle le programme de votre fonction, mais avec différents objets event qui n'a pas accept() et ignore() si vous obtenez un message d'erreur et se termine le programme avec le code de sortie 1.

Vous pouvez assigner self.close et programme Le programme appelez closeEvent() avec l'objet d'événement correct.

quit.triggered.connect(self.close)