簡體   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