如何使用 PythonQt 在 API 中正确关闭 QWidget 窗口
Posted
技术标签:
【中文标题】如何使用 PythonQt 在 API 中正确关闭 QWidget 窗口【英文标题】:How to properly close a QWidget-window in an API with PythonQt 【发布时间】:2016-10-24 08:02:59 【问题描述】:我在可视化程序的 API 中使用 Python 2.7。在其 2016 版本中,我使用 PySide 创建了一个 GUI,它运行良好。现在在他们的新 2017 版本中,他们从 PySide 更改为 PythonQt,所以我的导入和一些命令必须更改,但到目前为止它仍然有效。
但是如果我关闭我的 GUI 并尝试继续工作,例如打开一个当前或新项目,2017 版本正在退出,有时有,有时没有错误消息,但该消息根本没有帮助。
如果我以与 2016 版相同的方式关闭我的 GUI 窗口,则程序将关闭。奇怪的是,如果我使用在 Windows 7 Pro 中独立运行窗口时需要的关闭命令,程序中会显示错误(Traceback(最近一次调用最后一次):文件“”,第 1152 行,在 closeEvent ValueError: slot quit() -> void 需要 QApplication 实例作为第一个参数。),我的 GUI 已关闭,我可以继续工作。
所以我的 GUI 需要以某种方式关闭,到目前为止我还想不通。
我的 GUI 是通过在程序终端中调用 showMyGUI() 函数打开的,可以在其中执行 python 命令或按 F 按钮,该函数链接到该函数。
# -*- coding: utf-8 -*-
import sys, os
progVers = getVredVersion()[:1]
if progVers == "8": #2016-version
from PySide.QtCore import *
from PySide.QtGui import *
elif progVers == "9": #2017-version
from PythonQt.QtCore import *
from PythonQt.QtGui import *
class MainWindow(QWidget):
def __init__(self):
super(MainWindow, self).__init__()
grid = QGridLayout()
grid.setSpacing(10)
...
self.setWindowModality(Qt.ApplicationModal)
self.setWindowFlags(Qt.WindowStaysOnTopHint | Qt.WindowMaximizeButtonHint)
self.show()
def closeEvent(self,event):
progVers = getVredVersion()[:1]
if progVers == "8":
QApplication.instance().quit()
elif progVers == "9":
QApplication.quit() #as used for standalone in Windows 7 Pro
event.accept()
def showMyGUI():
app = QApplication.instance()
window = MainWindow()
app.exec_()
keyF11 = vrKey(Key_F11)
keyF11.connect(showMyGUI)
谁能告诉我如何正确关闭我的 GUI?
【问题讨论】:
你不能使用标准的self.close()
来关闭MainWindow
,它也会结束QApplication
。
已经尝试过了,但正如我上面提到的,当我尝试继续工作时,这会关闭整个程序。但我现在找到了解决方案。 MainWindow
现在继承形式 QDialog
并且需要一个父级(def __init__(self, parent=None):
和 super(MainWindow, self).__init__(parent)
)。创建MainWindow
对象时,可以在2016 版中使用verdMainWindow()
访问父窗口,在2017 版中使用vrMainWindow
访问父窗口。刚刚发现,但感谢您的回答。
嘿@JFT,将答案添加到您的帖子中,然后在几天后投票!
【参考方案1】:
我的解决方案是:
MainWindow
现在继承形式 QDialog
并且需要一个父级 (def __init__(self, parent=None
): 和 super(MainWindow, self).__init__(parent)
)。创建MainWindow
对象时,可以在2016 版中使用verdMainWindow()
访问父窗口,在2017 版中使用vrMainWindow
访问父窗口。我以这种方式创建了该类的对象window=MainWindow(vrMainWindow)
。
【讨论】:
以上是关于如何使用 PythonQt 在 API 中正确关闭 QWidget 窗口的主要内容,如果未能解决你的问题,请参考以下文章
如何在 java 中使用 REST API 身份验证? [关闭]