国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

MayaQTinterfacesinaclass

2019-11-14 17:44:03
字體:
來源:轉載
供稿:網友

Most tutorials online have suggested the way to fire commands inside QT interfaces launched n Maya (via cmds.loadUi – not involving pyQT) is to add a string PRoperty like:

 

+command="myPythonInstance.pythonCommand()"
 

Pretty craptastical – it can only fire commands inside a specific python module, the name of which has to be known when you’re laying out your interface.

Ideally, we’d like to have our interface instanced from a python class. This would allow us, amongst other things, so have multiple, independant instances. However it seems that a “self” reference can’t get passed to an interface, which is what you’d reallly like to do.

+command=self.pythonCommand

A (reasonably hacky) solution is to create the widget callbacks from inside our python class, after we’ve loaded the interface via cmds.loadUi().

import maya.cmds as cmdsclass myUi(object):    def __init__(self, *args):        uiFile = '/path/to/uiFile.ui'        rlDialog = cmds.loadUI(f=uiFile)        cmds.showWindow(rlDialog)        cmds.button( "ovrAdd_btn", edit=True, command=self.overrideAdd )    def overrideAdd(self, *args):        print 'do something!'

Which is slightly better, but we’re still referring to our widget by a string name. This is problematic if you have multiple instances of this class – targeting “ovrAdd_btn” is going to get confusing. We need to find out exactly which control, in amongst the whole widget mess, is the one that we’ve spawned when we’re called cmds.loadUI().

Sadly, loadUI() doesn’t give us any help in this department. So, and here’s the hacky bit, we can trawl through the widgets to find those belonging to our class instance, store them in a dict and then we can refer back to them by a simplified name. Easy!

import maya.cmds as cmdsdef widgetPath(windowName, widgetNames):    """        @param windowName: Window instance name to search    @param widgetNames: list of names to search for    """        returnDict = {}    mayaWidgetList = cmds.lsUI(dumpWidgets=True)        for widget in widgetNames:        for mayaWidge in mayaWidgetList:            if windowName in mayaWidge:                if mayaWidge.endswith(widget):                    returnDict[widget] = mayaWidge                        return returnDictclass myUi(object):    def __init__(self, *args):        uiWidgetList = ['ovrAdd_btn']        uiFile = '/path/to/uiFile.ui'        rlDialog = cmds.loadUI(f=uiFile)        self.uiObjects = widgetPath(rlDialog, uiWidgetList)                cmds.showWindow(rlDialog)                cmds.button( self.uiObjects["ovrAdd_btn"], edit=True, command=self.overrideAdd )    def overrideAdd(self, *args):        print 'do something!'

Trawling through Maya’s widget list isn’t particularly elegant, but you only have to do it once per class initialisation, so there isn’t too much of a cost. The advantage is that you can now have per-instance widget names.

Why not just use pyQT proper, you ask? Installing external dependencies isn’t always an option for our less techy brethren, or easily done in a studio-wide fashion. Using pyQT would be far better (and give all sorts of other benefits), but if you’re constrained to using vanilla maya / python, this seems to do the trick.

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 永寿县| 定州市| 雷州市| 肃南| 铁岭县| 黄梅县| 利川市| 德阳市| 江阴市| 苍梧县| 拉孜县| 苍梧县| 大英县| 巧家县| 铜川市| 五华县| 全南县| 三门峡市| 深水埗区| 泸水县| 大化| 临高县| 武邑县| 宜州市| 文登市| 蒙自县| 甘德县| 屏东市| 榆社县| 织金县| 东光县| 阿拉善右旗| 安丘市| 顺昌县| 淳安县| 永年县| 奉新县| 鄂温| 远安县| 德保县| 屏东县|