Pyside2 как открыть диалог но не всегда сверху

Я создаю основную рамку и кнопку,

и пусть нажата кнопка, чтобы открыть диалог, но диалог всегда сверху,

Я пытаюсь использовать setWindowsFlag, но не работаю.

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)

и код диалога

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)

главный

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

person Relax ZeroC    schedule 17.11.2017    source источник


Ответы (1)


Проблема вызвана тем, что главное окно является родительским для QDialog, поэтому его нужно удалить, но если это сделать, то сборщик мусора удалит его, поэтому QDialog нужно сделать членом класса:

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

Плюс: правильно не изменять дизайн, поэтому я перемещаю соединение и слот, связанный с нажатой кнопкой pb, и если мы хотим, чтобы оно закрывалось при закрытии окна, мы перезаписываем метод closeEvent():

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)
person eyllanesc    schedule 17.11.2017
comment
Большое спасибо ! еще вопрос, я закрываю основной фрейм, и этот открытый диалог тоже должен закрыться, должен ли я писать код для закрытия diloag или нет? - person Relax ZeroC; 17.11.2017
comment
да, он перезаписывает метод closeEvent и в этой части вы закрываете диалог - person eyllanesc; 17.11.2017
comment
Спасибо попробую~ - person Relax ZeroC; 17.11.2017
comment
Я добавил эту часть в свой ответ. - person eyllanesc; 17.11.2017
comment
если я нажимаю верхнюю правую кнопку закрытия, что-то работает в диалоговом окне (например, QtCore.QTimer()), как я могу этого избежать? - person Relax ZeroC; 17.11.2017
comment
Я тебя не понимаю, объясни лучше - person eyllanesc; 17.11.2017
comment
@RelaxZeroC Не добавляйте больше вопросов, ТАК есть место для отдельного сообщения для каждого вопроса. Создайте новый вопрос. - person eyllanesc; 17.11.2017
comment
ХОРОШО! выложу новый - person Relax ZeroC; 17.11.2017