Relax ZeroC
Relax ZeroC

Reputation: 683

Pyside2 how to open the dialog but not always on top

I create a main frame and a pushbutton ,

and let button clicked to open a dialog , but the dialog always on top ,

I try to used setWindowsFlag but not work.

from PySide2.QtWidgets import QApplication,QMainWindow,QTabWidget,QWidget
from PySide2.QtWidgets import QMessageBox,QFileDialog,QErrorMessage
from PySide2 import QtCore, QtGui, QtWidgets
class UI_Test20(object):
    def setupUi(self, Test202):
        Test202.setObjectName("Test202")
        Test202.resize(100,100)
        self.centralwidget = QtWidgets.QWidget(Test202)
        self.centralwidget.setObjectName("centralwidget")
        self.pb = QtWidgets.QPushButton(self.centralwidget)
        self.pb.setText('push button!')
        Test202.setCentralWidget(self.centralwidget)
        self.pb.clicked.connect(self.btnClicked)
        self.retranslateUi(Test202)
        QtCore.QMetaObject.connectSlotsByName(Test202)

    def retranslateUi(self, Test202):
        Test202.setWindowTitle(QtWidgets.QApplication.translate("Test202", "MainWindow", None, -1))

    def btnClicked(self):
        ui = Ui_Dialog1(self)
        ui.show()

class Test20(QMainWindow, UI_Test20) :

    def __init__(self, parent):
        super(Test20, self).__init__(parent)
        self.setupUi(self)

and the dialog code

class Ui_Dialog1(QtWidgets.QDialog):

    def __init__(self, parent=None):
        super(Ui_Dialog1, self).__init__(parent)
        self.p = parent
        self.setupUi(self)

    def setupUi(self, Dialog1):
        Dialog1.setObjectName("Dialog1")
        Dialog1.resize(333, 173)

main

if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    ui = Test20(None)
    ui.show()
    sys.exit(app.exec_())

Upvotes: 2

Views: 1362

Answers (1)

eyllanesc
eyllanesc

Reputation: 243887

The problem is caused by the fact that the main window is the parent of the QDialog, so it must be removed, but if that is done, the garbage collector will delete it, so the QDialog member of the class must be made:

def btnClicked(self):
    self.ui = Ui_Dialog1()
    self.ui.show()

Plus: the correct thing is not to modify the design so I move the connection and the slot associated with the clicked button pb and if we want it to close when the window closes we overwrite the closeEvent() method:

class Test20(QMainWindow, UI_Test20):
    def __init__(self, parent):
        super(Test20, self).__init__(parent)
        self.setupUi(self)
        self.pb.clicked.connect(self.btnClicked)

    def btnClicked(self):
        self.ui = Ui_Dialog1()
        self.ui.show()

    def closeEvent(self, *args, **kwargs):
        self.ui.close()
        QMainWindow.closeEvent(self, *args, **kwargs)

Upvotes: 2

Related Questions