2015-04-21 22 views
5

Sto scrivendo un semplice menu di strumenti per Maya e vorrei incollarlo al bordo del pannello del modello (prospettiva).Evento di ridimensionamento del pannello modello di Autodesk Maya

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

Il widget principale è posizionato esattamente dove voglio quando viene creato (orizzontalmente sul lato sinistro del pannello modello verticale - nel mezzo del pannello di modello).

Ho bisogno di riposizionarlo di conseguenza quando il pannello del modello viene ridimensionato, ma il pannello del modello non emette il segnale resized(). Gradirei qualsiasi consiglio.

+0

Un modo per ottenere un segnale 'resized' dalla finestra padre, invece? – mhlester

+0

@mhlester per quanto ne so, la finestra principale di Maya o qualsiasi altro widget Maya nativo non emette alcun evento quando ridimensionato. – Kupnu4

risposta

1

Ho provato molte cose per farlo funzionare ieri. Ho fatto alcune ricerche addizionale oggi ed è venuto a questo tema: cgsociety: Creating a floating button inside the viewport

In caso di collegamento interrotto, questo è uno dei la risposta:

È possibile utilizzare la geometria, ma ci sono alcuni problemi con l'attivazione comandi basati alla selezione e alla coda di annullamento. Se si vuole seguire questa percorso, vorrei suggerire cercando in zooHud e zooTriggers (parte del del zooToolbox)

Se si vogliono controllo GUI effettivo imparentato alla finestra, mel offre solo hudslider, hudbutton e headsUpMessage .

È anche possibile utilizzare PyQt e genitore in tue widgets/layout o quello che vuoi utilizzando qualcosa di simile:

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

Si può fare tutto un widget completa qt può fare con questo, quindi è estremamente flessibile. ma richiederebbe avere PyQt installato, che può essere una barriera a seconda della distribuzione degli strumenti.

ho fatto un mix di questa risposta e il tuo codice:

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

Uno dei problema che ho è che lo sfondo del widget è glitched: Screenshot

Se qualcuno sa perché e come sistemarlo, modifico la mia risposta con piacere. Altrimenti, quando si esegue questo script dall'editor di script di Maya, il widget segue il pannello quando viene ridimensionato.

0

Ho risolto un problema simile, ma non utilizzando Python/PyQt.

Il problema è che il tuo Qt Widget è lì. Non ho trovato il modo di renderlo non dipingendone lo sfondo.

La mia soluzione era diversa: ho derivato da un layout Qt, spinto tutti i miei widget in quel layout e usato MQtUtil per ottenere il QWidget di modelEditor che di modelPanel per attaccare il "vero layout di Qt" ad esso.

avvertimento pesante che può rendere Python non adatto: Maya non si aspetta "non-Maya" Layout di essere associato a "reale maya" Widget come modelEditors. Quindi devi ascoltare QEvents e scoprire quando distruggere il tuo layout, quindi Maya non si bloccherà.

0

set autofillbackground vero per risolvere il problema di fondo pittura

Problemi correlati