Maya 等待 Qt window 关闭
Maya wait for Qt window to close
通常在 Qt 应用程序中,您会在代码的开头和结尾使用它:
app = QtWidgets.QApplication(sys.argv)
...
app.exec_()
但在 Maya 中,您不使用它,因为 Qt 运行s 在 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)
一样正确等待?
QDialog 可能更适合您的需要,因为它运行自己的事件循环,不会阻塞程序,同时等待对话框完成。
重要的是在需要时调用它的exec_()
and call 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()
.[=17= 获得它的主要 window ]
通常在 Qt 应用程序中,您会在代码的开头和结尾使用它:
app = QtWidgets.QApplication(sys.argv)
...
app.exec_()
但在 Maya 中,您不使用它,因为 Qt 运行s 在 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)
一样正确等待?
QDialog 可能更适合您的需要,因为它运行自己的事件循环,不会阻塞程序,同时等待对话框完成。
重要的是在需要时调用它的exec_()
and call 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()
.[=17= 获得它的主要 window ]