繁体   English   中英

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

[英]How to create a new window button PySide/PyQt?

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM