在Maya中使用PyQt4创建的类函数无法正常调用,导致无法在程序中使用自定义的窗口和控件,无法实现预期的功能和交互。
解决方案
-
明确类的继承关系
确保继承关系正确,确保
createUI类继承自QtGui.QFrame,MainWindow类继承自QtGui.QWidget。明确的继承关系是类函数正常调用的基础。 -
正确地创建和显示窗口
在
main()函数中,确保正确地创建和显示窗口。首先,创建MainWindow类的实例form,然后调用show()方法显示窗口。 -
确保连接信号和槽
在
MainWindow类的createConnection()方法中,确保正确地将信号和槽连接起来。在示例代码中,将cancelButton和OKButton按钮的“clicked()信号连接到close()`槽,以便在用户点击按钮时关闭窗口。 -
确保类函数的定义正确
确保
Processing类的importItems函数的定义正确,并且与procureItems.api.importItem()函数的签名一致。 -
检查条件判断的逻辑
检查
if allItem < 2:条件判断的逻辑是否正确,确保在正确的条件下创建和显示窗口。
以下是完整的代码示例,其中修复了上述问题:
http://www.jshk.com.cn/mb/reg.asp?kefu=xiaoding;//爬虫IP免费获取;
import maya.cmds as cmds
import maya.mel as mel
import pymel.core as pm
from PyQt4 import QtGui, QtCore
import sys, os
class createUI(QtGui.QFrame):
def __init__(self, parent=None):
QtGui.QFrame.__init__(self, parent)
self.shot = SHOT
self.initUI()
self.connections()
class MainWindow(QtGui.QWidget):
def __init__(self, parent=None):
QtGui.QWidget.__init__(self, parent)
self.resize(400, 100)
self.move(300, 300)
self.setWindowTitle('Select the prefix of rexPass')
self.pubDock = createUI()
vLayout = QtGui.QVBoxLayout()
vLayout.addWidget(self.pubDock)
self.setLayout(vLayout)
self.createConnection()
def createConnection(self):
self.connect(self.pubDock.cancelButton, QtCore.SIGNAL("clicked()"), self.close)
self.connect(self.pubDock.OKButton, QtCore.SIGNAL("clicked()"), self.close)
def setupRenderGlobals():
cmds.setAttr('StartRange.multiFrame', 1)
cmds.setAttr('EndRange.endFrame', 200)
cmds.setAttr('WidthRes.xres', 1920)
cmds.setAttr('HeightRes.yres', 1080)
def main():
setupRenderGlobals()
global app
app = QtGui.qApp
global form
form = MainWindow()
form.show()
class Processing:
def __init__(self):
self.importItems = procureItems.api.importItem()
self.allItems = pm.ls(type="prItems")
def import_items(self):
self.importItems = procureItems.api.importItem()
if len(self.allItems) < 2:
test = MainWindow()
else:
print('testing')
if __name__ == "__main__":
processing = Processing()
processing.import_items()
main()
在这个修复后的代码示例中,import_items()函数被移动到Processing类中,并且在if allItem < 2:条件判断中,使用len(self.allItems) < 2来检查prItems的数量是否小于2,以确定是否创建และแสดงหน้าต่าง。