如何使用PySide获取maya主窗口指针?

时间:2014-03-11 16:52:22

标签: python pyqt pyside maya

我在maya中使用了PyQt4,通常我发现切换到PySide非常容易,但是我无法获得指向主窗口的指针。也许有人可以理解出了什么问题。

这是我在PyQt4中所做的:

import sip, PyQt4.QtCore
import maya.OpenMayaUI as mui
ptr = mui.MQtUtil.mainWindow()
parent = sip.wrapinstance(long(ptr), PyQt4.QtCore.QObject)

这很好用。当我在PySide中尝试相同时:

import sip, PySide.QtCore
import maya.OpenMayaUI as mui
ptr = mui.MQtUtil.mainWindow()
parent = sip.wrapinstance(long(ptr), PySide.QtCore.QObject)

我收到以下错误:

# Error: wrapinstance() argument 2 must be sip.wrappertype, not Shiboken.ObjectType
# Traceback (most recent call last):
#   File "<maya console>", line 4, in <module>
# TypeError: wrapinstance() argument 2 must be sip.wrappertype, not Shiboken.ObjectType # 

任何人都知道出了什么问题?

2 个答案:

答案 0 :(得分:12)

您需要导入shiboken而不是sip并将QWidget传递给wrapInstance而不是QObject

修改:Maya2017包含shiboken2PySide2,而不是shibokenPySide,如下面的评论中所述。

import shiboken
from PySide import QtGui, QtCore
import maya.OpenMayaUI as apiUI

def getMayaWindow():
    """
    Get the main Maya window as a QtGui.QMainWindow instance
    @return: QtGui.QMainWindow instance of the top level Maya windows
    """
    ptr = apiUI.MQtUtil.mainWindow()
    if ptr is not None:
        return shiboken.wrapInstance(long(ptr), QtGui.QWidget)

请注意,sipwrapinstance,其中 i 不是资金,但shiboken.wrapInstance i 是资本。

shiboken.wrapInstance()需要将wrapertype作为第二个参数,因此您可以将QWidget作为第二个参数传递。

答案 1 :(得分:0)

由于先前的答案已过时,因此此版本是最新版本,可避免有人必须自己更新它。

获取Maya主窗口的两种方法:

  • 使用PySide2:
from PySide2 import QtWidgets

global app
app = QtWidgets.QApplication.instance() #get the qApp instance if it exists.
if not app:
    app = QtWidgets.QApplication(sys.argv)


def getMayaMainWindow():
    mayaWin = next(w for w in app.topLevelWidgets() if w.objectName()=='MayaWindow')

    return mayaWin

print(getMayaMainWindow())
  • 使用shiboken2和maya API:
import maya.OpenMayaUI as apiUI
from PySide2 import QtWidgets

try:
    import shiboken2
except:
    from PySide2 import shiboken2


def getMayaMainWindow():
    ptr = apiUI.MQtUtil.mainWindow()
    mayaWin = shiboken2.wrapInstance(long(ptr), QtWidgets.QWidget)

    return mayaWin

print(getMayaMainWindow())