我就不废话了,先说一下用designer画窗口然后在maya中加载的傻瓜式操作:
#!/usr/bin/env python # -*- coding: utf-8 -*- # author: Dango Wang # time : 2019/3/19 import xml.etree.ElementTree as xml from cStringIO import StringIO import maya.OpenMayaUI as mui from shiboken2 import wrapInstance import pyside2uic as uic from PySide2 import QtWidgets # 此行删除 def loadUiType(uiFile): # 用来动态地将ui文件转为py文件 parsed = xml.parse(uiFile) widget_class = parsed.find('widget').get('class') form_class = parsed.find('class').text with open(uiFile, 'r') as f: o = StringIO() frame = {} uic.compileUi(f, o, indent=0) pyc = compile(o.getvalue(), '<string>', 'exec') exec pyc in frame # Fetch the base_class and form class based on their type in the xml from designer form_class = frame['Ui_%s' % form_class] base_class = getattr(QtWidgets, widget_class) return form_class, base_class # 此行删除 def getMayaWindow(): #获取maya主窗口 main_window_ptr = mui.MQtUtil.mainWindow() return wrapInstance(long(main_window_ptr), QtWidgets.QWidget) # 此行删除 form_class, base_class = loadUiType('D:/test.ui') # 动态加载ui文件 # 此行删除 class TestWindow(base_class, form_class): # base为窗口类型(等价于QtWidgets.QDialog),form为自己写的界面 def__init__(self): super(TestWindow, self).__init__(parent=getMayaWindow()) self.setupUi(self) # 此行删除 test_w = TestWindow() test_w.show() 7.完成!现在你有了第一个Qt窗口了: ![]() 不用designer的方法: 如果你对qt很熟悉,大可以直接在maya里用pyside写窗口(就像很多人用mel写过窗口一样)。通过下面的脚本,你也可以在maya里得到相同的窗口(注意删掉空白行,否则会出语法错误): #!/usr/bin/env python # -*- coding: utf-8 -*- # author: Dango Wang # time : 2019/3/19
from PySide2 import QtCore, QtWidgets import maya.OpenMayaUI as mui from shiboken2 import wrapInstance
defgetMayaWindow(): main_window_ptr = mui.MQtUtil.mainWindow() return wrapInstance(long(main_window_ptr), QtWidgets.QWidget)
classTestWindow(QtWidgets.QDialog): def__init__(self): super(TestWindow, self).__init__(parent=getMayaWindow()) self.setupUi(self)
defsetupUi(self, Dialog): Dialog.setObjectName("Dialog") Dialog.resize(429, 293) self.buttonBox = QtWidgets.QDialogButtonBox(Dialog) self.buttonBox.setGeometry(QtCore.QRect(30, 240, 341, 32)) self.buttonBox.setOrientation(QtCore.Qt.Horizontal) self.buttonBox.setStandardButtons(QtWidgets.QDialogButtonBox.Cancel|QtWidgets.QDialogButtonBox.Ok) self.buttonBox.setObjectName("buttonBox") self.label = QtWidgets.QLabel(Dialog) self.label.setGeometry(QtCore.QRect(160, 70, 191, 81)) self.label.setObjectName("label")
self.retranslateUi(Dialog) QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL("accepted()"), Dialog.accept) QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL("rejected()"), Dialog.reject) QtCore.QMetaObject.connectSlotsByName(Dialog)
defretranslateUi(self, Dialog): Dialog.setWindowTitle(QtWidgets.QApplication.translate("Dialog", "Dialog", None)) self.label.setText(QtWidgets.QApplication.translate("Dialog", "Hello,QT!!", None))
window_ = TestWindow() window_.show() 得到的窗口与上面完全一样。 那这两种方式有什么区别呢?显然,直接用designer画更方便更快!写过mel窗口的同学们都知道,写一个插件,可能写界面就要耗费大部分的时间,而如果能快速在designer中画出窗口然后在maya中动态加载,那花在界面上的时间将大大减少!如果你喜欢写个人小工具,只需要按照第一种方案,就可以从写界面的坑中脱离!恭喜你! 但是也不要高兴地太早。如果完全依赖designer,将导致对qt的知识非常陌生。建议初学者在使用designer的同时,多尝试手写qt窗口。而且,你也可以通过pyside-uic.exe来将.ui文件转成py文件,在cmd中运行如下: C:\Python27\Scripts\pyside-uic.exe -o D:\test.py D:\test.ui 运行完你就会发现D盘多了个D:\test.py,该文件就是由ui文件生成的py文件。打开它,你就可以了解窗口的实现细节。 Ps: 注意上面脚本中的PySide2.如果你用的是maya2016之前的版本(>maya2011),那需要换成PySide。官方给的解决方案是这样的: try: from shiboken2 import wrapInstance import pyside2uic as uic from PySide2 import QtWidgets, QtCore except ImportError: from shiboken import wrapInstance from PySide import QtGui as QtWidgets from PySide import QtCore import pysideuic as uic 至于脚本中的更多细节,如果你感兴趣,请再接再厉,好好理解吧!! 或者你可以加我微信,交流交流? ![]() (小声说:snoopy322~) ---------------------------------------------------------------------------------------------------------------------- 我们尊重原创,也注重分享,文章来源于微信公众号:东浩在此,建议关注公众号查看原文。如若侵权请联系qter@qter.org。 ---------------------------------------------------------------------------------------------------------------------- |