我在使用 Python 2.7 的 PyQt4/PySide 中使用“新窗口”功能时遇到问题。我连接了一个initNewWindow()
函数,创建一个新窗口,一个操作并将其放入菜单栏中。曾经是桌面软件中的常见功能。新窗口不会弹出并关闭,而是会在另一个窗口旁边提供一个新的持久窗口。我正在处理的代码是专有的,因此我创建了一个示例,该示例执行相同的操作,但出现以下相同的错误。有什么办法让它发挥作用吗?使用 Python 2.7 在 PySide 中运行。它是在 Windows 中编写和测试的。
from PySide.QtCore import QSize
from PySide.QtGui import QAction
from PySide.QtGui import QApplication
from PySide.QtGui import QLabel
from PySide.QtGui import QMainWindow
from PySide.QtGui import QMenuBar
from PySide.QtGui import QMenu
from sys import argv
def main():
application = QApplication(argv)
window = QMainWindow()
window.setWindowTitle('New Window Test')
menu = QMenuBar(window)
view = QMenu('View')
new_window = QAction('New Window', view)
new_window.triggered.connect(initNewWindow)
view.addAction(new_window)
menu.addMenu(view)
label = QLabel()
label.setMinimumSize(QSize(300,300))
window.setMenuBar(menu)
window.setCentralWidget(label)
window.show()
application.exec_()
def initNewWindow():
window = QMainWindow()
window.setWindowTitle('New Window')
window.show()
if __name__ == '__main__':
main()
如果函数创建应用程序需要继续使用的 PyQt 对象,则必须确保以某种方式保留对其的引用。否则,它可能会在函数返回后立即被 Python 垃圾收集器删除。
因此,要么为该对象提供一个父对象,要么将其保留为其他对象的属性。 (原则上,该对象也可以成为全局变量,但这通常被认为是不好的做法)。
以下是示例脚本的修订版本,演示了如何解决您的问题:
from PySide import QtGui, QtCore
class Window(QtGui.QMainWindow):
def __init__(self):
QtGui.QMainWindow.__init__(self)
menu = self.menuBar().addMenu(self.tr('View'))
action = menu.addAction(self.tr('New Window'))
action.triggered.connect(self.handleNewWindow)
def handleNewWindow(self):
window = QtGui.QMainWindow(self)
window.setAttribute(QtCore.Qt.WA_DeleteOnClose)
window.setWindowTitle(self.tr('New Window'))
window.show()
# or, alternatively
# self.window = QtGui.QMainWindow()
# self.window.setWindowTitle(self.tr('New Window'))
# self.window.show()
if __name__ == '__main__':
import sys
app = QtGui.QApplication(sys.argv)
window = Window()
window.resize(300, 300)
window.show()
sys.exit(app.exec_())
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)