2012-06-27 2 views
1

Есть ли какое-либо управление кривой в pyqt ?, Я добавил изображение, основанное на maya gradientControl. Я смотрю что-то похожее на pyqt, где я хочу отредактировать кривую, и каждое редактирование должно вызвать некоторый сигнал. Теперь я могу использовать sip, и я могу обернуть maya gradientControl в мое окно pyqt, но оно действительно не работает должным образом. Вот код, который я пытаюсь сделать. Это просто 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

И пользовательский интерфейс содержит окно мянь и QFrame с. Вот майя documentation

Но я ищу некоторые чистые виджеты QT или какое-то представление о том, как мы можем это реализовать. Я пробовал с QPolygon, но не знаю, как мы можем манипулировать временем выполнения контрольной точки. Есть идеи ?

Заранее спасибо.

+0

Я думаю, что добавление обратного вызова будет решением на данный момент, но будет приятно знать, что если кто-нибудь знает какой-нибудь виджет что-то похожее на это. – Achayan

ответ

1

Поскольку управление градиентом написано на стороне C++ кода майя, для него нет открытого интерфейса в виде виджета PyQt4, как вы, возможно, уже обнаружили (и, насколько я знаю).

Что вы можете получить, это ссылка на QWidget, которая позволяет вам повторно и разместить ее в своем приложении по своему усмотрению. Но для работы с ним оттуда, лучше всего, чтобы просто подключить к python commands callbacks for the gradient control

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

Если имеющиеся обратные вызовы для gradientControlNoAttr не достаточно для вас, то я боюсь, вам придется свернуть ваш собственный пользовательский виджет, используя ваши собственные события рисования (или используя классы QGraphics).

+0

callbacks не работает для меня. Я думаю о написании виджета самостоятельно, но не уверен, где я хочу начать. – Achayan

+0

Я думаю, что обратные вызовы будут работать, но контроль над виджетами ограничен. Проблема заключается в том, что я хочу запросить общие изменения от виджета, например, сколько добавленных пунктов так сложно. – Achayan

+1

Это не кажется слишком сложным. Вы можете использовать опциюVar, чтобы просто получить полный ответ строки кривой или отслеживать изменения с помощью обратного вызова. По большей части это похоже на виджет с интерфейсом атрибута crappier. – jdi