maya中PySide一个很诡异的问题

背景:

       笔者想在maya主窗口中加一个button,并且点击的时候实现一些方法,然而,常规的代码居然出现了很诡异的问题。


maya 中的代码如下:

import maya.OpenMayaUI as omUI
from PySide import QtCore, QtGui
import shiboken,time


def getMayaWindow():
    ptr = omUI.MQtUtil.mainWindow()
    return shiboken.wrapInstance(long(ptr), QtGui.QMainWindow)

class Project_Display:
    def __init__(self):
        self.mayaWin = getMayaWindow()
        
    def myShow(self):
        self.projectBtn = QtGui.QPushButton(self.mayaWin)
        self.projectBtn.setGeometry(QtCore.QRect(390, 110, 100, 23))
        self.projectBtn.setObjectName("pushButton")
        self.projectBtn.setText( "PushButton")
        self.projectBtn.clicked.connect(self.test1)
        self.projectBtn.show()

    def test1(self):
        print 'test'

def main():
    aa = Project_Display()
    aa.myShow()
        
main()

此时,maya窗口中出现了一个button,点击它,毫无反应。


笔者此时仔细阅读了代码,发现代码虽然写的不很漂亮,但是功能上貌似没有问题,就是看起来怪怪的。

在机缘巧合之下,笔者把main函数取消掉,实例化Project_Display这个类,再调用myShow方法,诡异的一幕产生了。

代码如下:

import maya.OpenMayaUI as omUI
from PySide import QtCore, QtGui
import shiboken,time


def getMayaWindow():
    ptr = omUI.MQtUtil.mainWindow()
    return shiboken.wrapInstance(long(ptr), QtGui.QMainWindow)

class Project_Display:
    def __init__(self):
        self.mayaWin = getMayaWindow()
        
    def myShow(self):
        self.projectBtn = QtGui.QPushButton(self.mayaWin)
        self.projectBtn.setGeometry(QtCore.QRect(290, 110, 100, 23))
        self.projectBtn.setObjectName("pushButton")
        self.projectBtn.setText( "PushButton")
        self.projectBtn.clicked.connect(self.test1)
        self.projectBtn.show()

    def test1(self):
        print 'test'


aa = Project_Display()
aa.myShow()
        


为了避免按钮的重叠导致的结果不准,这里把按钮出现的位置向左挪了100个像素。

此时,点击按钮是有效的。

笔者此刻心中一万头草泥马呼啸而过。


虽然从功能上来讲,问题是得以解决,然而,公司代码规定,每个单独的包调用时候必须要有一个main()函数。

于是,笔者加入了partial,代码如下:

import maya.OpenMayaUI as omUI
from PySide import QtCore, QtGui
import shiboken,time
from functools import partial

def getMayaWindow():
    ptr = omUI.MQtUtil.mainWindow()
    return shiboken.wrapInstance(long(ptr), QtGui.QMainWindow)

class Project_Display:
    def __init__(self):
        self.mayaWin = getMayaWindow()
        
    def myShow(self):
        self.projectBtn = QtGui.QPushButton(self.mayaWin)
        self.projectBtn.setGeometry(QtCore.QRect(190, 110, 100, 23))
        self.projectBtn.setObjectName("pushButton")
        self.projectBtn.setText( "PushButton")
        self.projectBtn.clicked.connect(partial(self.test1))
        self.projectBtn.show()

    def test1(self,*args):
        print 'test'

def main():
    aa = Project_Display()
    aa.myShow()
        
main()

同样,为避免按钮重复,此时的按钮又向左移动了100个像素。

于是,按钮又起作用了。

如果说partial有用的话,lambda应该也有用,于是笔者又做了如下修改:

import maya.OpenMayaUI as omUI
from PySide import QtCore, QtGui
import shiboken,time
from functools import partial

def getMayaWindow():
    ptr = omUI.MQtUtil.mainWindow()
    return shiboken.wrapInstance(long(ptr), QtGui.QMainWindow)

class Project_Display:
    def __init__(self):
        self.mayaWin = getMayaWindow()
        
    def myShow(self):
        self.projectBtn = QtGui.QPushButton(self.mayaWin)
        self.projectBtn.setGeometry(QtCore.QRect(90, 110, 100, 23))
        self.projectBtn.setObjectName("pushButton")
        self.projectBtn.setText( "PushButton")
        self.projectBtn.clicked.connect(lambda *args: self.test1())
        self.projectBtn.show()

    def test1(self):
        print 'test'

def main():
    aa = Project_Display()
    aa.myShow()
        
main()

好吧,它果然有用。


总结:

以后有空研究下pyside的信号机制。






猜你喜欢

转载自blog.csdn.net/xdhstc/article/details/52767970