2012-06-27 2 views
1

pyqt에 커브 컨트롤이 있습니까? maya gradientControl을 기반으로 이미지를 첨부했습니다. 나는 커브를 편집하고 각각의 편집이 어떤 신호를 트리거해야하는 pyqt와 비슷한 것을 찾고 있는데, 지금은 sip을 사용할 수 있으며, 내 pyqt 윈도우로 maya gradientControl을 래핑 할 수 있지만 예상대로 작동하지 않습니다. 여기에 제가 시도하는 코드가 있습니다. 그것의 단지 QWidget 그래서 곡선에 점을 추가 할 때 일어나는 것을 찾기가 매우 어렵습니다.Curve Control with 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 위젯으로 공개 인터페이스가 없습니다 (그리고 내가 아는 한).

당신에게 당신이 원하는대로 당신의 애플 리케이션 내에 reparent하고 배치 할 수있게 해주는 QWidget 레퍼런스가 여러분에게 줄 것입니다. 그러나 거기에에서 작업에 관해서는, 당신의 최선의 방법은 당신이 롤 할 것이다 두려워 그냥 gradientControlNoAttr에 사용할 수있는 콜백 당신을 위해 충분하지 않은 경우 python commands callbacks for the gradient control

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

까지 연결하는 것입니다 자신 만의 페인트 이벤트 (또는 QGraphics 클래스 사용)를 사용하는 사용자 정의 위젯.

+0

콜백이 실제로 나를 위해 작동하지 않습니다. 나는 위젯을 직접 작성하는 것에 대해 생각하고 있지만 어디에 시작하고 싶은지 확신 할 수 없습니다. – Achayan

+0

콜백이 작동하지만 위젯에 대한 제어가 제한적이라고 생각합니다. 문제는 위젯에서 얼마나 많은 점을 추가했는지와 같이 위젯의 ​​전체 변경 사항을 쿼리하려는 경우입니다. – Achayan

+1

너무 어려워 보이지 않습니다. optionVar를 사용하여 커브의 전체 문자열 담당자를 얻거나 콜백을 사용하여 변경 내용을 추적 할 수 있습니다. 대부분의 경우 그것은 더 까다로운 속성 인터페이스가있는 위젯과 같습니다. – jdi