2015-04-21 18 views
5

Maya için basit bir araç menüsü yazıyorum ve model panelin kenarına yapıştırmak istiyorum (perspektif). Oluşturulduğunda istediğim burada Autodesk Maya model paneli resize olayı

from PySide import QtCore, QtGui 
from maya import OpenMayaUI as omui 
from shiboken import wrapInstance 

class TestWidget(QtGui.QWidget): 
    def __init__(self, parent=None): 
     QtGui.QWidget.__init__(self, parent = self.getMayaWindow()) 

     self.setWindowFlags(QtCore.Qt.Tool | QtCore.Qt.FramelessWindowHint) 
     self.setFixedSize(100, 100) 

     panelPtr = omui.MQtUtil.findControl('modelPanel4') 
     panel = wrapInstance(long(panelPtr), QtGui.QWidget) 

     position = panel.mapToGlobal(panel.pos()) 
     self.move(position.x(), position.y() + panel.geometry().height()/2 - self.geometry().height()/2) 

     mainLayout = QtGui.QVBoxLayout(self) 

     button = QtGui.QPushButton('CLOSE') 
     button.setFixedSize(80, 80) 
     button.clicked.connect(self.deleteLater) 

     mainLayout.addWidget(button) 

    def getMayaWindow(self): 
     omui.MQtUtil.mainWindow()  
     ptr = omui.MQtUtil.mainWindow() 
     return wrapInstance(long(ptr), QtGui.QWidget) 

w = TestWidget() 
w.show() 

ana eklendi

tam olarak konumlandırılır (yatay modelde panelin sol tarafında dikey olarak, - modelde panelin ortasında).

Model paneli yeniden boyutlandırıldığında buna göre yeniden konumlandırmam gerekiyor, ancak model paneli resized() sinyalini yaymıyor. Herhangi bir tavsiyeye minnettar olurum.

+0

Herhangi bir şekilde düzeltmek için Doğru autofillbackground? – mhlester

+0

@mhlester bildiğim kadarıyla, Maya ana penceresi veya başka bir yerel Maya widget'leri yeniden boyutlandırıldığında herhangi bir olay yaymaz. – Kupnu4

cevap

1

Bu çalışma için birçok şey deniyorum. Bugün biraz additionnal araştırmalar yaptık ve bu konu geldi: kırık link halinde cgsociety: Creating a floating button inside the viewport

, bu cevabın biridir:

Sen geometriyi kullanabilirsiniz ancak esaslı komutları tetikleme ile bazı sorunlar vardır seçim ve geri alma sırası. Bunu yoluna devam etmesini istiyorsanız, zooHud ve zooTriggers ( Bölüm zooToolbox)

Eğer görüntü alanına ebeveynli gerçek GUI kontrolünü eksik olan Mel sadece hudslider, hudbutton sunar ve headsUpMessage içine bakarak öneririm .

Ayrıca böyle bir şey kullanarak istediğiniz ne olursa olsun kendi özel widget'ları/düzenleri veya yılında PyQt ve ebeveyn kullanabilirsiniz:

import maya.OpenMayaUI as apiUI import sip 

from PyQt4 import QtGui 

view = apiUI.M3dView() 
apiUI.M3dView.getM3dViewFromModelPanel('modelPanel4', view) 
viewWidget = sip.wrapinstance(long(view.widget()), QtCore.QObject) 

global myBtn 
myBtn = QtGui.QPushButton(viewWidget) 
myBtn.setText('testing!') 
myBtn.move(100, 100) #Relative to top-left corner of viewport myBtn.show() 

Tam bir qt Widget o ile yapabilirsiniz şeyi yapabilir, böylece olduğundan son derece esnek. ama PyQt yüklü olması gerekir, aletinizin dağıtımına bağlı olarak bir bariyer olabilir.

Ben bu cevabın karışımını ve kodunuzu yaptı: Ben widget arka plan glitched olduğunu buna sahip konunun

from PySide import QtCore, QtGui 
from maya import OpenMayaUI as omui 
from shiboken import wrapInstance 

class CustomQWidget(QtGui.QWidget):  
    def __init__(self, *args, **kwargs): 
     QtGui.QWidget.__init__(self, *args, **kwargs) 

     mainLayout = QtGui.QVBoxLayout(self) 

     closeButton = QtGui.QPushButton('CLOSE') 
     closeButton.setFixedSize(80, 40) 
     closeButton.clicked.connect(self.deleteLater) 

     helloButton = QtGui.QPushButton('HELLO') 
     helloButton.setFixedSize(80, 40) 
     helloButton.clicked.connect(self.printHello) 

     #Trying to fix glitchy background/Doesn't work, why? 
     #Is it because layouts don't have background? 
     p = self.palette() 
     p.setColor(self.backgroundRole(), QtCore.Qt.red) 
     self.setPalette(p) 
     self.setAttribute(QtCore.Qt.WA_StyledBackground, True) 
     ############################## 

     mainLayout.addWidget(closeButton) 
     mainLayout.addWidget(helloButton) 

    def printHello(self): 
     print "Hello" 

view = omui.M3dView() 
omui.M3dView.getM3dViewFromModelPanel('modelPanel4', view) #Given the name of a model panel, 
#get the M3dView used by that panel. If this fails, then a panel with the given name could not be located. 
viewWidget = wrapInstance(long(view.widget()), QtGui.QWidget) 

position = viewWidget.mapToGlobal(viewWidget.pos()) 

w = CustomQWidget(viewWidget) 
w.move(0, viewWidget.geometry().height()/2 - 100/2) #Relative to middle-left corner of viewport 
w.show() 

Bir: Screenshot

herkes bilir ve neden nasıl düzeltilir, cevabımı zevkle düzenlerim. Else, bu komut dosyasını Maya'nın komut düzenleyicisinden çalıştırırken, pencere boyutu yeniden boyutlandırıldığında paneli izler.

0

Böyle bir sorunu çözdüm ama Python/PyQt kullanmıyordum.

Sorun şu ki, Qt Widget'ınız orada. Arka planını boyamak için bir yol bulamadım.

Çözümüm farklıydı: Bir Qt Düzeninden türedim, tüm widget'larım bu düzene aktardım ve MQtUtil'i kullanarak, modelin QEidget'ini "gerçek Qt düzenini" ekleyebilmesi için bu modelin QWidget'ini aldım. Python uygun değildir yapabilir

Ağır uyarı: Maya "non-Maya" Düzenleri beklemediği modelEditors gibi "gerçek-Maya" Widget'lar bağlı kalmayı. Yani QEvents'ları dinlemeli ve düzeninizi ne zaman yok edeceğinizi öğrenmelisiniz, bu yüzden Maya denemeye çalışmıyor.

0

seti arka plan boyama sorunu yerine ana penceresinden bir `resized` sinyal almak için