Chr*_*her 4 python windows pyqt pyside
我在使用Python 2.7的PyQt4/PySide中遇到了"New Window"函数的问题.我连接了一个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()
Run Code Online (Sandbox Code Playgroud)
如果函数创建了应用程序需要继续使用的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_())
Run Code Online (Sandbox Code Playgroud)