2012-06-27 71 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