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

Reply via email to