我正在学习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
但它没有帮助?
我错过了什么地方?如何打开弹出窗口并使其在上面的代码中可见?
修改 从注释中,我们需要维护新窗口对象的引用,以便gc不会清除它。那么在我们运行代码之后,第一个窗口是如何保持不变的呢?
通过在列表中添加它来进行引用,它将创建多个窗口。我只需要创建窗口。并且父窗口关闭然后自动关闭弹出窗口。
如何在上面的代码中使用QtCore.Qt.WA_DeleteOnClose
方法?
答案 0 :(得分:0)
也许尝试将弹出窗口的父级设置为主窗口?在starter.py中,请尝试pop.show(self)
而不是pop.show()
。