Второе окно Pyside2 (QDialog) закрывает основное

import sys

from PySide2.QtCore import QFile
from PySide2.QtWidgets import QApplication, QMainWindow
from PySide2.QtUiTools import QUiLoader


class MyMainWindow(QMainWindow):
    def __init__(self):
        super().__init__()

        loader = QUiLoader()
        self.ui = loader.load("mainWindow.ui", self)

        self.ui.pushButton_call_dialog.clicked.connect(self.call_dialog)
        self.ui.close()

        self.ui.show()


    def call_dialog(self):
        loader = QUiLoader()
        self.dialog = loader.load("dialog.ui")

        self.dialog.show()


if __name__ == '__main__':

    app = QApplication(sys.argv)
    window = MyMainWindow()
    window.show
    sys.exit(app.exec_())

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

Процесс завершен с кодом выхода 0

Спасибо за вашу помощь


person rad ham    schedule 05.01.2019    source источник
comment
Что такое window.show? Если это вызов метода, то вы забыли скобки.   -  person German Lashevich    schedule 06.01.2019
comment
window.show работает как надо даже без круглых скобок   -  person rad ham    schedule 06.01.2019
comment
@radham window.show ничего не делает, удалите его и наблюдайте за тем же поведением, вместо этого, если вы используете window.show(), вы получите другой.   -  person eyllanesc    schedule 06.01.2019
comment
Это похоже на ошибку в pyside/pyside2. Эквивалентный код в pyqt5 работает именно так, как ожидалось. То есть закрытие диалогового окна не приводит к закрытию главного окна. Ошибка, кажется, в QUiLoader, потому что использование простого QMainWindow восстанавливает ожидаемое поведение.   -  person ekhumoro    schedule 06.01.2019


Ответы (2)


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

import sys
from PySide2.QtWidgets import *

class MyWindow(QMainWindow):
    def __init__(self):
        QMainWindow.__init__(self)
        button = QPushButton("Dialog")
        button.clicked.connect(self.open_dialog)
        self.setCentralWidget(button)

    def open_dialog(self):
        dialog = MyDialog()
        dialog.show()
        dialog.exec_()


class MyDialog(QDialog):
    def __init__(self):
        QDialog.__init__(self)

        button = QPushButton("Close")
        button.clicked.connect(self.close_dialog)

        layout = QHBoxLayout()
        layout.addWidget(button)
        self.setLayout(layout)

    def close_dialog(self):
        self.close()

if __name__ == "__main__":
    app = QApplication()
    m = MyWindow()
    m.show()
    sys.exit(app.exec_())

Просто обратите внимание, что вы должны включить шаг setUp в каждый класс. Надеюсь, поможет.

person cmaureir    schedule 07.01.2019

Вынести диалог в отдельный класс тоже не получилось. Каждый раз, когда вызывается событие Dialog.close(), оно закрывает все приложение.

Что сработало для меня, так это использовать hide() вместо этого

person Alfredo cubitos    schedule 06.09.2020