2016-11-16 4 views
0

Ich benutze Qt Designer um meine GUI's zu erstellen und sie in py Dateien mit pyuic5 zu konvertieren. Mein Endziel ist hier, den Benutzer vom Schließen des Programms zu unterbrechen, wenn eine Variable == 1 und sie mit einem "Sind Sie sicher, dass Sie schließen möchten?" Geben Sie den Dialog ein. Wenn die Variable == 0 ist, dann schließe das Programm normal.PyQt5 Interrupt Close Event von außerhalb des Main Gui Moduls

Ich habe viele Beispiele dafür gesehen, aber alle von ihnen erfordern die Bearbeitung des Codes im GUI-Modul. Ich importiere meine gui.py-Datei, die von pyuic5 erstellt wurde, in mein Hauptscript, wo ich alle meine Verbindungen zu Buttons, Zeilenänderungen usw. mache. Ich tue dies, damit ich jederzeit die GUI mit Qt Designer aktualisieren und die Programmfunktionalität nicht beeinflussen kann .

Gibt es eine Möglichkeit, dies von meinem Hauptskript zu tun, das das GUI-Modul von Qt Designer importiert hat?

Beispiel dafür, wie mein Haupt-Skript ist strukturiert:

import philipsControlGui 
import sys 

def main(): 
    MainWindow.show() 
    sys.exit(app.exec_()) 

def test(): 
    print('test') 

# Main window setup 
app = philipsControlGui.QtWidgets.QApplication(sys.argv) 
MainWindow = philipsControlGui.QtWidgets.QMainWindow() 
ui = philipsControlGui.Ui_MainWindow() 
ui.setupUi(MainWindow) 

# Main window bindings 
ui.onButton.clicked.connect(test) 
### Can I insert something here to do: if user closes the window... do something else instead? 

if __name__ == "__main__": 
    main() 
+0

Sie müssen die Methode closeEvent überschreiben (wie Sie wahrscheinlich bereits aus den vielen Beispielen wissen). Ich weiß nicht, ob du das in Qt Designer machen kannst. – Trilarion

Antwort

1

Sie sollten eine Unterklasse von importierten gui erstellen, so dass Sie die closeEvent Methode neu implementieren können:

import sys 
from PyQt5 import QtCore, QtGui, QtWidgets 
from philipsControlGui import Ui_MainWindow 

class MainWindow(QtWidgets.QMainWindow):  
    def __init__(self): 
     super(MainWindow, self).__init__() 
     self.ui = Ui_MainWindow() 
     self.ui.setUpUi(self) 
     self.ui.onButton.clicked.connect(self.test) 
     self._check_close = True 

    def test(self): 
     print('test') 
     self._check_close = not self._check_close 

    def closeEvent(self, event): 
     if self._check_close: 
      result = QtWidgets.QMessageBox.question(
       self, 'Confirm Close', 'Are you sure you want to close?', 
       QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.No) 
      if result == QtWidgets.QMessageBox.Yes: 
       event.accept() 
      else: 
       event.ignore() 

def main(): 
    app = QtWidgets.QApplication(sys.argv) 
    window = MainWindow() 
    window.show() 
    sys.exit(app.exec_()) 

if __name__ == '__main__': 

    main() 
+0

Dies sollte funktionieren. Vielen Dank – WhiskyRyan

-1

Wenn es einen bestimmten ‚Exitbutton‘ in Ihrem Design ist, sollten Sie in der Lage sein, es in dem Haupt-Code zu verbinden und einen Pop-up-Dialog zu erstellen. Sie müssten die QtCore/QtGui-Komponenten importieren. Ich schreibe immer meine GUI direkt (QtDesigner Schmerz ist, wenn es um diese Dinge geht), so gehe ich davon etwas wie folgt aus:

from PyQt4.QtGui import * 
from PyQt4.QtCore import * 

[YOUR CODE] 

ui.ExitButton.clicked.connect(Exit) 

def Exit(): 

    msg = QMessageBox() 
    msg.setIcon(QMessageBox.Information) 

    msg.setText("Are you sure you want to close this window?") 
    msg.setWindowTitle("MessageBox demo") 
    msg.setStandardButtons(QMessageBox.Ok | QMessageBox.Cancel) 
    msg.buttonClicked.connect(msgbtn) 
    retval = msg.exec_() 
    print "value of pressed message box button:", retval 
+0

Danke. Ich habe ein Exit Action Item, das ich auf diese Weise verbinden kann, aber wie würde ich das gleiche Ergebnis sicherstellen, wenn der Benutzer die 'X' Taste im Fensterrahmen benutzt? – WhiskyRyan

+0

Es gibt ein Hauptfenster CloseEvent, das Sie steuern können. Werfen Sie einen Blick auf diese: http://StackOverflow.com/Questions/22460003/Pyqts-QmainWindow-CloseEvent-is-ne- – avelampudi

+0

Eine andere narrensichere Möglichkeit, um sicherzustellen, dass der Benutzer das nicht tut, ist Ihre GUI voll zu machen Bildschirm mit - mainWindow.showFullScreen() – avelampudi

Verwandte Themen