2012-06-27 38 views
1

pyqt中是否有任何曲线控制?我附加了一个基于maya gradientControl的图像。我正在寻找一些与pyqt类似的地方,我想编辑曲线,每个编辑都应该触发一些信号。现在我可以使用sip,并且我可以将maya gradientControl封装到我的pyqt窗口中,但实际上并不像预期的那样工作。这是我正在尝试的代码。它只是一个QWidget,所以当我在曲线上添加一个点时很难找到发生的事情。使用PyQt进行曲线控制

import os 
import maya.cmds as cmds 
import maya.mel as mel 
import maya.OpenMayaUI as mui 
import sys 
import sip 
from PyQt4 import QtGui, QtCore, uic 
baseUI = os.path.join(os.path.dirname(__file__), "range_ctrl.ui") 
baseUIClass, baseUIWidget = uic.loadUiType(baseUI) 

def getMayaWindow(): 
    windowPointer = mui.MQtUtil.mainWindow() 
    return sip.wrapinstance(long(windowPointer), QtCore.QObject) 

def convertToQT(controlName): 
    controlPoniter = mui.MQtUtil.findControl(controlName) 
    if controlPoniter is not None: 
     return sip.wrapinstance(long(controlPoniter), QtCore.QObject) 

class MayaRangeCtrl(baseUIWidget, baseUIClass): 
    def __init__(self, parent=getMayaWindow()): 
     super(baseUIWidget, self).__init__(parent) 
     self.setupUi(self) 
     self.setObjectName("mayaRangeCtrl") 
     self.setWindowTitle("Range Control") 
     self.p1_vbox = QtGui.QVBoxLayout(self.frame) 
     self.range_ctr = cmds.gradientControlNoAttr('mayaaaa', h=90) 
     mayaQTObj = convertToQT(self.range_ctr) 
     self.p1_vbox.addWidget(mayaQTObj) 
     self.setCentralWidget(self.frame) 
     self.show() 

def main(): 
    myWindow = MayaRangeCtrl() 

def run(): 
    main() 

这里是屏幕截图。

enter image description here

和UI包含勉窗口和一个QFrame。 这里是玛雅人documentation

但我正在寻找一些纯粹的QT小部件或一些想法,我们如何能够实现这一点。我尝试过使用QPolygon,但不知道如何操作控制点运行时间。任何想法 ?

在此先感谢。

+0

我认为现在添加回调将是一个解决方案,但是如果有人知道任何小部件类似于此,将会很高兴。 – Achayan

回答

1

因为渐变控制是写在maya代码的C++端,所以没有像你可能已经发现的PyQt4小部件的公共接口(并且据我所知)。

sip会给你什么样的QWidget参考,让你可以按照自己的需要将其重新放置在应用中。至于从那里使用它,最好的办法是只连接到python commands callbacks for the gradient control

cmds.gradientControlNoAttr(self.range_ctr, e=True, changeCommand=self.myCallback) 

如果用于gradientControlNoAttr可用的回调是不够的,你,那么恐怕你将不得不推出您自己的自定义小部件使用您自己的绘画事件(或使用QGraphics类)。

+0

回调不是真的为我工作。我正在考虑自己编写一个小部件,但不知道我想从哪里开始。 – Achayan

+0

我认为回调将起作用,但对小部件的控制是有限的。问题是,如果我想从小部件中查询全部更改,比如添加了多少个点就像这样非常困难。 – Achayan

+1

这似乎不太难。您可以使用optionVar来获取曲线的完整字符串表示,也可以使用回调来跟踪更改。大多数情况下,它就像一个拥有crappier属性接口的小部件。 – jdi