如何创建一个新窗口按钮PySide / PyQt?

时间:2011-12-12 17:22:25

标签: python windows pyqt pyside

我在使用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()

2 个答案:

答案 0 :(得分:5)

如果函数创建了应用程序需要继续使用的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_())

答案 1 :(得分:3)

initNewWindow()返回时,window变量被删除,窗口的引用计数降为零,导致新创建的C ++对象被删除。这就是你的窗口立即关闭的原因。

如果你想让它保持打开状态,请务必保持参考。最简单的方法是让新窗口成为调用窗口的子窗口,并设置其WA_DeleteOnClose窗口小部件属性(请参阅Qt::WidgetAttribute)。