【问题标题】:Pyside2 second window(QDialog) closes the main onePyside2第二个窗口(QDialog)关闭主窗口
【发布时间】:2019-06-01 02:39:56
【问题描述】:
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 结束

感谢您的帮助

【问题讨论】:

  • 什么是window.show?如果它是一个方法的调用,那么你忘记了括号。
  • window.show 即使没有括号也能正常工作
  • @radham window.show 不做任何事情,删除它并观察相同的行为,如果你使用 window.show(),你会得到另一个。
  • 这看起来像是 pyside/pyside2 中的一个错误。 pyqt5 中的等效代码完全按预期工作。也就是说,关闭对话框不会同时关闭主窗口。该错误似乎在QUiLoader 中,因为使用普通的QMainWindow 可以恢复预期的行为。

标签: python pyside2


【解决方案1】:

你可以在一个单独的类上处理你的 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 步骤。 希望对您有所帮助。

【讨论】:

    【解决方案2】:

    将对话框放入单独的类中对任何一个都不起作用。 每次调用 Dialog.close() 事件时,都会关闭整个应用程序。

    对我有用的是使用 hide() 代替

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-23
      • 2015-01-23
      相关资源
      最近更新 更多