Hey there, This issue, as far as I know, relates to something I addressed in one of my maya python training videos (vol 2). When you create a ui in Qt Designer and then have maya generate the actual GUI from it, its doing translations to represent widgets. With that in mind, the exact hierarchy and objects aren't completely 1-to-1 or fully accessible all the time. Some of the widgets translate into maya objects that you can control using the commands module, others are simply not accessible in a normal fashion.
The specific issue I am referring to here is regarding layouts. A layout is one of those objects that you can't fully expect to use with commands module, as it becomes just a generic layout when it translates to maya. The problem I have seen is when you have a layout inside another layout, which is perfectly valid in Qt. Maya will do some things differently during translation, and actually give you issues if you don't put a QWidget in between. Also, the hierarchy does end up being different. Consider this Qt Designer UI file: http://pastebin.com/82W8Kne5 It is a QDialog, with a main horizontal layout, containing two vertical layouts, each with a push button. On the left side, the vertical layout is placed directly into the horizontal layout. On the right side, a placeholder widget is added first, then set with a vertical layout and then the push button. Look at the hierarchy when I do this: form = test.MyForm(win) fullName = mui.MQtUtil.fullName for name in ('layout1', 'button1', 'placeHolderWidget', 'layout2', 'button2'): obj = getattr(form, name) path = fullName(long(sip.unwrapinstance(obj))) print path ## output ## MayaWindow|MayaTestDialog|layout1 MayaWindow|MayaTestDialog|mainLayout|button1 MayaWindow|MayaTestDialog|mainLayout|placeHolderWidget MayaWindow|MayaTestDialog|mainLayout|layout2 MayaWindow|MayaTestDialog|mainLayout|layout2|button2 Notice that with the layout-within-layout, button1 isn't even showing that its a child of layout1 On the other side, button2 does show that its a child of layout2, yet layout2 still isnt showing that its a child of placeHolderWidget. So, Maya does some under the hood reorganizing when it translates. When I try and setParent to layout1, for me Maya actually crashes completely. I'm not sure what OS you are running, and maybe because your UI is set up differently you just get a traceback. But, I can however setParent to layout2 just fine. Ultimately, you have to be careful with how you expect to use a Qt layout in combination with the commands module UI widgets. My final suggestion, regarding wanting to now add an attrFieldSliderGrp to your ui, is to stick with PyQt if you are already designing with it. You will reduce your limitations in trying to translate between the two worlds constantly. An attrFieldSliderGrp is basically a QLabel, a QLineEdit with a QDoubleValidator set on it, and a QSlider, all placed in a horizontal layout. And then you just cross connect the signals between the QLineEdit and QSlider. This may seem like more work rather than trying to just throw in an existing Maya widget, but what you get is more control over these items. You don't have to wonder what the translation will do, and you have instant easy access to the complete range of signals, events, and even being able to wrap this up into its own nice subclass with customizations. Hope this helps -- justin On Thu, Mar 8, 2012 at 7:07 AM, 张宇 <[email protected]> wrote: > I want to add a attrFieldSliderGrp to my Qt window, I create the Qt UI > with QtDesinger, there is another file to load the .ui file, I get the > layout's path in maya with MQtUtil.fullName(), I got it. > The QVBoxLayout's name is "SDK_VL", > When used mc.setParent(layoutName) I get a wrong feedback: > # Error: line 1: setParent: Object > 'MayaWindow|SuperFaceJntUIObj|SDK_Layout' not found. > # Traceback (most recent call last): > # File "<maya console>", line 1, in <module> > # File "D:/workflow/MyPys/superFaceJnt.py", line 195, in <module> > # main() > # File "D:/workflow/MyPys/superFaceJnt.py", line 191, in main > # d = MyForm(win) > # File "D:/workflow/MyPys/superFaceJnt.py", line 32, in __init__ > # self.addWidget() > # File "D:/workflow/MyPys/superFaceJnt.py", line 40, in addWidget > # mc.setParent(SDK_layout) > # RuntimeError: setParent: Object > 'MayaWindow|SuperFaceJntUIObj|SDK_Layout' not found. # > If I print the layout's name, I got: > MayaWindow|SuperFaceJntUIObj|SDK_VL > > Here is my code: > import sys > import os > > from PyQt4 import QtGui, QtCore, uic > import sip > > import maya.cmds as mc > import maya.OpenMayaUI as mui > > uifile = os.path.join(currentPath, 'superFaceJnt2.ui') > form_class, base_class = uic.loadUiType(uifile) > > global app > > class MyForm(form_class, base_class): > def __init__(self, parent, **kwargs): > QtGui.QWidget.__init__(self, parent, **kwargs) > self.setupUi(self) > self.addWidget() > > def addWidget(self): > SDK_layout = > mui.MQtUtil.fullName(long(sip.unwrapinstance(self.SDK_VL))) > print SDK_layout > mc.setParent(SDK_layout) > #self.bn = mc.button() > > def main(): > global app > app = QtGui.QApplication.instance() > ptr = mui.MQtUtil.mainWindow() > win = sip.wrapinstance(long(ptr), QtCore.QObject) > d = MyForm(win) > d.show() > > main() > > I need HELP!!! > -- > http://zhangyu.me > http://zhang-yu.appspot.com > > -- > view archives: http://groups.google.com/group/python_inside_maya > change your subscription settings: > http://groups.google.com/group/python_inside_maya/subscribe > -- view archives: http://groups.google.com/group/python_inside_maya change your subscription settings: http://groups.google.com/group/python_inside_maya/subscribe
