如何在Maya中使用PyQt4创建可调用的类函数

76 阅读2分钟

在Maya中使用PyQt4创建的类函数无法正常调用,导致无法在程序中使用自定义的窗口和控件,无法实现预期的功能和交互。

解决方案

huake_00198_.jpg

  1. 明确类的继承关系

    确保继承关系正确,确保createUI类继承自QtGui.QFrameMainWindow类继承自QtGui.QWidget。明确的继承关系是类函数正常调用的基础。

  2. 正确地创建和显示窗口

    main()函数中,确保正确地创建和显示窗口。首先,创建MainWindow类的实例form,然后调用show()方法显示窗口。

  3. 确保连接信号和槽

    MainWindow类的createConnection()方法中,确保正确地将信号和槽连接起来。在示例代码中,将cancelButtonOKButton按钮的“clicked()信号连接到close()`槽,以便在用户点击按钮时关闭窗口。

  4. 确保类函数的定义正确

    确保Processing类的importItems函数的定义正确,并且与procureItems.api.importItem()函数的签名一致。

  5. 检查条件判断的逻辑

    检查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,以确定是否创建และแสดงหน้าต่าง。