背景:
笔者想在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的信号机制。