通常在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)
?
一个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,但是根据此答案,您可以使用maya.OpenMayaUI
shiboken的模块获取其主窗口wrapInstance()
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句