【问题标题】:Open New MainWindow from MainWindow on button click in PySide without closing immediately在 PySide 中单击按钮时从 MainWindow 打开 New MainWindow 而不会立即关闭
【发布时间】:2015-04-01 18:25:21
【问题描述】:

我正在学习 Python 中的 GUI 编程。我正在使用 Pyside 框架。为了练习,我正在开发一个简单的应用程序,用户单击打开新窗口按钮。我已经开发了简单的原型:

MainFile.py

from PySide import QtGui, QtCore
import Starter
import sys

if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    starter = Starter.StartClass()
    starter.show()
    sys.exit(app.exec_())

Starter.py

from PySide import QtGui, QtCore
import start1_ui, pop_up

class StartClass(start1_ui.Ui_MainWindow):
    def __init__(self, parent=None):
        QtGui.QMainWindow.__init__(self, parent)
        self.setupUi(self)
        self.click_button.clicked.connect(self.call_method)

    def call_method(self):
        print 'hey! I am Starter'
        pop = pop_up.PopupClass()
        pop.setAttribute(QtCore.Qt.WA_DeleteOnClose)
        pop.show()

pop_up.py

from PySide import QtGui, QtCore
import popup_ui
class PopupClass(popup_ui.Ui_MainWindow):
    def __init__(self, parent=None):
        QtGui.QMainWindow.__init__(self, parent)
        self.setupUi(self)
        #self.setAttribute(QtCore.Qt.WA_DeleteOnClose)
        print 'I am shown'

我已经使用 pyside-uic 将 qtDesigner 中创建的 *.ui 文件转换为 *.py。我没有放这些 py 文件,因为它们太大了。文件结构为

start1_ui.py

from PySide import QtCore, QtGui
class Ui_MainWindow(QtGui.QMainWindow):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(437, 290)
        ## Much more code for setting various widget attribute as width. height 
        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        MainWindow.setWindowTitle(QtGui.QApplication.translate("MainWindow", "MainWindow", None, QtGui.QApplication.UnicodeUTF8))
        self.click_button.setText(QtGui.QApplication.translate("MainWindow", "ClickMe", None, QtGui.QApplication.UnicodeUTF8))

popup_ui.py

class Ui_MainWindow(QtGui.QMainWindow):
    def setupUi(self, MainWindow):
        #setting up widgets here
        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        MainWindow.setWindowTitle(QtGui.QApplication.translate("MainWindow", "MainWindow", None, QtGui.QApplication.UnicodeUTF8))
        self.label.setText(QtGui.QApplication.translate("MainWindow", "Finally, I am  opened", None, QtGui.QApplication.UnicodeUTF8))

现在,当我单击 starter.py 中的按钮时,新的弹出窗口会打开但会立即关闭。我尝试使用属性作为QtCore.Qt.WA_DeleteOnClose 但它没有帮助?

我错过了什么?如何打开弹出窗口并使其在上面的代码中可见?

编辑: 从 cmets 中,我们需要维护新窗口对象的引用,以便 gc 不会清理它。那么为什么我们运行代码后第一个窗口仍然保持原样?

通过将其添加到列表中以进行引用,它将创建多个窗口。我只需要创建窗口。并且 f 父窗口也被关闭然后自动关闭弹出窗口。

如何在上面的代码中使用QtCore.Qt.WA_DeleteOnClose 方法?

【问题讨论】:

  • PyQt window closes after launch 的可能重复项
  • 你没有在 Python 中存储引用和垃圾收集立即再次破坏了窗口。
  • @three_pineapples,我看过这些问题,你提到过。但是在给出的答案中,可以打开多个窗口。此外,如果我关闭父窗口,即 Starter,那么 Popup 也会保持打开状态。只需要允许一个弹出窗口,当我关闭启动窗口时,打开的弹出窗口应该关闭
  • 那么这可能是另一个问题。您当前的问题是由于新窗口没有父窗口时未存储对新窗口的引用引起的。如果您想要特定的亲密行为,但自己无法解决,我建议您发布一个新问题。

标签: python pyqt pyside qt-designer


【解决方案1】:

也许尝试将弹出窗口的父窗口设置为主窗口?在 starter.py 中,尝试使用 pop.show(self) 而不是 pop.show()

【讨论】:

  • 没有接受参数的 show() 方法
  • 天哪,我写这个答案的时候一定很累。我的意思是说pop = pop_up.PopupClass(self)。虽然从后来出现的其他 cmets 来看,也许这也不是你想要的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-09
  • 1970-01-01
  • 2018-01-10
相关资源
最近更新 更多