使用PyQt进行曲线控制

时间:2012-06-27 05:27:23

标签: python pyqt qwidget maya

pyqt中是否有曲线控制?我附加了一个基于maya gradientControl的图像。我正在寻找与pyqt类似的东西,我想编辑曲线,每个编辑都应该触发一些信号。现在我可以使用sip,我可以将maya gradientControl包装到我的pyqt窗口但是它真的没有按预期工作。这是我正在尝试的代码。它只是一个QWidget,所以当我在曲线上添加一个点时很难找到发生的事情。

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包含一个mian窗口和一个QFrame。 这是玛雅人documentation

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

提前致谢。

1 个答案:

答案 0 :(得分: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类)推出自己的自定义小部件。