IordanouGiannis
IordanouGiannis

Reputation: 4357

PyQt:Why a popup dialog prevents execution of other code?

I am having a little problem with a pop up dialog.I have a combobox,which when the option changes it pops up a dialog with a textedit widget,do some stuff and insert some text in the textedit widget.

This is what i use for the popup:

def function_1(self):
    dialog = QDialog()
    dialog.ui = Ui_Dialog_popup()
    dialog.ui.setupUi(dialog)
    dialog.setAttribute(QtCore.Qt.WA_DeleteOnClose)
    dialog.exec_()

I have the pop up gui code made in QtDesignere in a separate py file.

The popup dialog appears,but if the dialog is not closed,nothing else can be executed.Do you know how can I deal with this ? Thanks.

Upvotes: 2

Views: 4264

Answers (3)

ekhumoro
ekhumoro

Reputation: 120568

Since you're setting the WA_DeleteOnClose window attribute, I'm assuming you want to create a new dialog every time the function_1 method is called (which is probably a good idea).

If so, the simplest way to solve your issue (based on the code you've given), is to give your dialog a parent (so it is kept alive), and then display it modelessly using show():

def function_1(self):
    dialog = QDialog(self)
    dialog.ui = Ui_Dialog_popup()
    dialog.ui.setupUi(dialog)
    dialog.setAttribute(QtCore.Qt.WA_DeleteOnClose)
    dialog.show()

Upvotes: 0

shekhar
shekhar

Reputation: 1420

Elaborating on what Mat said: The show() function immediately returns, and as dialog is local to this function, the object gets deleted as soon as "function_1" returns. You might want to make the dialog a member or global (whichever suits your requirement) so that the object stays in memory.

HTH

Upvotes: 1

Mat
Mat

Reputation: 206659

That's exactly what the exec method of QDialog is designed for: modal dialogs. Read the "Modal" and "Modeless dialog" sections.

If you don't the dialog to block your main UI, call show() instead of exec() (and check the modal property documentation).

Upvotes: 5

Related Questions