如何创建一个新的窗口按钮 PySide/PyQt?
Posted
技术标签:
【中文标题】如何创建一个新的窗口按钮 PySide/PyQt?【英文标题】:How to create a new window button PySide/PyQt? 【发布时间】:2011-12-12 17:22:24 【问题描述】:我在使用 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()
【问题讨论】:
【参考方案1】:如果一个函数创建了一个应用程序需要继续使用的 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_())
【讨论】:
【参考方案2】:当initNewWindow()
返回时,window
变量被删除,窗口的引用计数降至零,导致新创建的 C++ 对象被删除。这就是您的窗口立即关闭的原因。
如果您想保持打开状态,请确保保留参考。最简单的方法是让您的新窗口成为调用窗口的子窗口,并设置其WA_DeleteOnClose
小部件属性(请参阅Qt::WidgetAttribute
)。
【讨论】:
也许你的意思是,WA_DeleteOnClose
?
@JohnDoe:是的,当然。将其与WA_SantaClause
混淆了...谢谢 ;)以上是关于如何创建一个新的窗口按钮 PySide/PyQt?的主要内容,如果未能解决你的问题,请参考以下文章
PySide/PyQT5:如何从 QGraphicsItem 发出信号?
Python: PySide(PyQt)QMessageBox按钮显示中文
如何显示 PySide/PyQt UI 并自动运行其中一种方法?