Thanks a lot Super Cute Justin! There is a small doubt, I know how to control the attribute with the QSlider, but how to change the silder's value by the attribute? Create a scriptJob? Then with the same problem, how to edit the QSlider's in maya.
2012/3/9 Justin Israel <[email protected]> > 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 > -- http://thatboy.me -- view archives: http://groups.google.com/group/python_inside_maya change your subscription settings: http://groups.google.com/group/python_inside_maya/subscribe
