【问题标题】:Maya wait for Qt window to closeMaya 等待 Qt 窗口关闭
【发布时间】:2021-05-18 05:11:27
【问题描述】:

通常在 Qt 应用程序中,您会在代码的开头和结尾使用它:

app = QtWidgets.QApplication(sys.argv)
...
app.exec_()

但在 Maya 中,您不使用它,因为 Qt 在它自己的 Maya 应用程序上运行。如果您不知道 Maya 是什么,我相信这对于许多其他应用程序也同样适用。也就是说,我的代码如下所示:

import sys
from PySide2 import QtWidgets, QtGui, QtCore

class Test():
    def __init__(self):
        self.open_qt()

    def open_qt(self):
        # app = QtWidgets.QApplication(sys.argv) # Don't need this in Maya
        self.window = QtWidgets.QWidget() # I tried QDialog also

        btn = QtWidgets.QPushButton("press me")
        btn.clicked.connect(self.login)

        lay = QtWidgets.QVBoxLayout()
        lay.addWidget(btn)

        self.window.setLayout(lay)
        self.window.show()

        # app.exec_() # Don't need this in Maya

    def login(self):
        print("logged in!")

print("before")
temp = Test()
print("after")

但是在 Maya 中运行它我得到了这个结果:

before
after
logged in!

但我需要它:

before
logged in!
after

如果您在 Maya 之外运行此代码(并且使用这两条注释掉的行),那么您会得到正确的结果(此处为上方的块)。

如何让 Maya Qt 也像使用 QtWidgets.QApplication(sys.argv) 时一样正确等待

【问题讨论】:

  • 您是否需要“等待”窗口,因为您需要检索一些之后进行计算所需的数据(例如,用户插入一个值)?
  • 正是@musicamante! :)

标签: python qt pyside maya qapplication


【解决方案1】:

QDialog 可能更适合您的需求,因为它运行自己的事件循环,不会阻塞程序,同时等待对话框完成

重要的是调用它的exec_(),并在需要时调用accept()

from PySide2 import QtWidgets, QtGui, QtCore

class Test(QtWidgets.QDialog):
    def __init__(self, parent=None):
        super(Test, self).__init__(parent)
        layout = QtWidgets.QVBoxLayout(self)

        self.spinBox = QtWidgets.QSpinBox()
        layout.addWidget(self.spinBox)

        btn = QtWidgets.QPushButton("press me")
        layout.addWidget(btn)
        btn.clicked.connect(self.login)

    def login(self):
        print("logged in!")
        self.accept()


dialog = Test()
if dialog.exec_():
    print(dialog.spinBox.value())

我没有Maya,但是根据this answer你可以使用maya.OpenMayaUI模块和shiboken的wrapInstance()得到它的主窗口。

【讨论】:

  • 我展示了使用 PyQt5 的示例,但实际上我在 Maya 中使用了 PySide2。这会改变你的代码吗? (当然除了顶级进口)
  • 使用您的 Python 2 示例,我仍然收到此错误:'PySide2.QtWidgets.QDialog' called with wrong argument types: PySide2.QtWidgets.QDialog(SwigPyObject)。不过,我认为您的概念是正确的。
  • @Frank 1)我确实对 PyQt 有一些疑问,因为据我所知 Maya 使用 PySide2(那么,你为什么要问 PyQt 而不是 PySide?) 2)我删除了最后一部分,因为我无法测试它,请尝试使用链接答案中提供的代码来获取主窗口(使用 shiboken wrapInstance)
  • 感谢您的帮助!我让它工作了。我用工作代码编辑了你的答案。等它被接受,然后你可以随意改变你的答案:)
猜你喜欢
  • 1970-01-01
  • 2017-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-05
  • 2014-10-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多