Unsolved Trying to use closeEvent on MainWindow if user press X
-
@DouglinhasZN said in Trying to use closeEvent on MainWindow if user press X:
However, nothing seems to happen.
What does this mean? You get no UI appear when you run the program,
MainWindow.__init__()
is not called, , or you don't get the close message box when you try to close the widget? Do yourself a favor and at least put in a couple ofprint()
statements so you know what is being executed. -
@JonB I had some print statement, but they dont get printed. The code itself don't seem to run. When I close the application, nothing happens, it just closes as it normally would
-
@DouglinhasZN
Nothing shown in your post above is going to run if you never create an instance ofMainWindow
. You only show that fragment of your code, not where you create it from, so who knows. -
@JonB said in Trying to use closeEvent on MainWindow if user press X:
your post above is going to run if you never create an instance of MainWindow.
What do you mean where I create it from?
@JonB -
@JonB I see where you are coming from, you mean adding the following under: if name == "main":
w = MainWindow() w.setupUi(MainWindow)
?
I have tried that and indeed it does work, but it creates a new application. In that application it does everything I want it to, but its not my main one -
@DouglinhasZN
I'm sorry, I really don't understand. There is no "new application"! I suspect you mean a new, separate window, which is kind of what I was wondering....We have seen your latest
class MainWindow(QWidget):
definition. Can you now paste the whole of your code fromif __name__ == "__main__":
downward and then we might see what is going on. The trouble is we keep seeing snippets....
-
Hello!
You can try my code, it should intercept the close event:
class UI_MainWindow(QMainWindow): def __init__(self): super(UI_MainWindow, self).__init__() print("Initialization succeeded") def closeEvent(self, event): print("closeEvent has been called") userResult = QMessageBox.question(None, "Quit", "Do you want to close the program?", QMessageBox.Yes, QMessageBox.No) if userResult == QMessageBox.Yes: event.accept() else: event.ignore()
-
@JonB I see, I have posted the whole of my code up in the thread, but here it is:
import sys from PyQt5 import QtCore, QtGui, QtWidgets from PyQt5.QtWidgets import QMessageBox import urllib3 from urllib.request import urlopen from bs4 import BeautifulSoup from urllib.parse import urlparse urllib3.disable_warnings() class Ui_Proofo(object): def setupUi(self, Proofo): {Here is the UI, so all my labels, buttons, boxes etc.} def retranslateUi(self, Proofo): from CVE_Design import Ui_Proofo class MainWindow(QWidget): def __init__(self): super(MainWindow, self).__init__() self.ui = Ui_Proofo() self.ui.setupUi(self) def closeEvent(self, event): close = QMessageBox.question(self, "QUIT", "Are you sure want to stop process?", QMessageBox.Yes | QMessageBox.No, QMessageBox.No) print("okay this is done 2") if close == QMessageBox.Yes: print("okay this is done 3") event.accept() else: event.ignore() if __name__ == "__main__": import sys app = QtWidgets.QApplication(sys.argv) Proofo = QtWidgets.QMainWindow() ui = Ui_Proofo() ui.setupUi(Proofo) Proofo.show() sys.exit(app.exec_())
-
So, what happens when you press
X
on theMainWindow
? -
@DouglinhasZN
You have written a newclass MainWindow
with thecloseEvent()
in it, but you never create/useMainWindow
anywhere in your code, do you? That's why it has no effect.Proofo = QtWidgets.QMainWindow()
still creates it asQMainWindow
. You need to create it as aMainWindow
to use the code shown.Sorry, I haven't any more time right now, hopefully someone will show what you're supposed to do. Hopefully it's just
Proofo = MainWindow()
And I think you want to get rid of your
ui = Ui_Proofo() ui.setupUi(Proofo)
because
MainWindow.__init__()
is doing that bit. So:if __name__ == "__main__": import sys app = QtWidgets.QApplication(sys.argv) Proofo = MainWindow() Proofo.show() sys.exit(app.exec_())
-
@Cobra91151 Nothing happens, its almost as if its not linking that class to the overall GUI.
Instead, if I addw = MainWindow() w.setupUi(MainWindow)
Then it will load up a new window as well as the main window. On that new window, the code will work fine
@JonB I hear what you're saying, I had similar code to what you've suggested but I ran with your suggestion and it opens up a new blank window rather than my Ui from Qt Designer (Proofo)
-
@DouglinhasZN said in Trying to use closeEvent on MainWindow if user press X:
w = MainWindow()
w.setupUi(MainWindow)That code does not make sense.
Straight from the documentation I linked:
import sys from PyQt5.QtWidgets import QApplication, QDialog from ui_imagedialog import Ui_ImageDialog << The file generated from your .ui file app = QApplication(sys.argv) window = QDialog() << a widget ui = Ui_ImageDialog() << instance of the generated class ui.setupUi(window) << the parameter of setupUi must be an instance of a QWidget based class. In this case QDialog. window.show() sys.exit(app.exec_())