2015-04-21 40 views
5

Piszę proste menu narzędziowe dla Mayi i chciałbym przykleić je do granicy panelu modelu (perspektywy).Autodesk Maya zmiana rozmiaru panelu modelu

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() 

Głównym widget jest umieszczony dokładnie tam, gdzie chcę i kiedy zostanie on utworzony (poziomo na lewej stronie panelu modelu w pionie - w środku panelu modelu).

Muszę zmienić położenie odpowiednio podczas zmiany rozmiaru panelu modelu, ale panel modelu nie emituje sygnału resized(). Byłbym wdzięczny za radę.

+0

W jaki sposób można zamiast tego uzyskać "resized" sygnał z okna nadrzędnego? – mhlester

+0

@mhlester o ile mi wiadomo, główne okno programu Maya lub inne natywne widżety Maya nie emitują żadnych zdarzeń po zmianie rozmiaru. – Kupnu4

Odpowiedz

1

Próbowałem wielu rzeczy, aby wczoraj zadziałało. Zrobiłem pewne źródło dodatkowego badania dzisiaj i doszedł do tego tematu: cgsociety: Creating a floating button inside the viewport

W przypadku przerwanego łącza, to jest jedna z odpowiedzi:

Można użyć geometrii, ale są pewne problemy z wyzwalanie polecenia oparte przy wyborze i kolejce cofania. Jeśli chcesz iść tą drogę, chciałbym zaproponować spojrzenie na zooHud and zooTriggers (część zooToolbox)

Jeśli chcą rzeczywistą kontrolę GUI parented do rzutni, mel oferuje tylko hudslider, hudbutton i headsUpMessage .

Można również skorzystać z PyQt i rodziców w swoje własne widgety/układów lub co chcesz za pomocą czegoś takiego:

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() 

Można zrobić coś pełny qt widget można zrobić z tym, dlatego niezwykle elastyczny. ale wymagałoby to zainstalowania PyQt, co może być barierą w zależności od dystrybucji narzędzi.

zrobiłem mieszankę tej odpowiedzi i kod:

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() 

Jedną z kwestii mam to, że tła widgetu jest glitched: Screenshot

Jeśli ktoś wie dlaczego i jak to naprawić, z przyjemnością zredaguję odpowiedź. Inaczej, podczas uruchamiania tego skryptu z edytora skryptów Maya, widget podąża za panelem po zmianie rozmiaru.

0

Naprawiłem taki problem, ale nie używając Python/PyQt.

Sam problem polega na tym, że istnieje Twój widget Qt. Nie znalazłem sposobu, aby to pomalować jego tło.

Moje rozwiązanie było inne: wyprowadziłem z układu Qt, wepchnąłem wszystkie moje widżety do tego układu i użyłem MQtUtil, aby pobrać QWidget tego modelu modelPanel, aby dołączyć do niego "prawdziwy układ Qt".

Ciężki zastrzeżenie, które mogą uczynić Python nie nadaje: Maya nie spodziewa się „non-Maya” Układy być zobowiązany do „rzeczywistego” Maya Widgets jak modelEditors. Musisz więc posłuchać QEvents i dowiedzieć się, kiedy zniszczyć swój układ, aby Maya nie uległa awarii.

0

ustaw autofillbackground Prawda, aby naprawić swój problem z malowaniem tła