2015-04-21 14 views
5

Ich schreibe ein einfaches Werkzeug-Menü für Maya, und ich möchte es an den Rand des Modell-Panel (Perspektive) zu halten.Autodesk Maya Modell Panel Größe Ereignis

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

Das Haupt Widget ist genau dort positioniert, wo ich will, wenn es erstellt wird (sich horizontal auf der linken Seite der Modellplatte, vertikal - in der Mitte der Modellplatte).

Ich muss es entsprechend neu positionieren, wenn das Modellpanel in der Größe geändert wird, aber das Model Panel gibt kein resized() Signal aus. Ich würde mich über jede Beratung freuen.

+0

irgendeine Weise zu beheben ein 'resized' Signal von dem übergeordneten Fenster, anstatt zu bekommen? – mhlester

+0

@mhlester soweit ich weiß, Maya Hauptfenster oder andere native Maya-Widgets geben keine Ereignisse bei der Größenänderung. – Kupnu4

Antwort

1

Ich habe viele Dinge versucht, um dies gestern zu arbeiten. Ich habe einige zusaetzliche Untersuchungen heute und kam zu diesem Thema: cgsociety: Creating a floating button inside the viewport

Bei Defekten Link, dies ist einer der Antwort:

Sie Geometrie verwenden können, aber es gibt einige Probleme mit der Auslösung Befehle basieren auf Auswahl und die Rückgängig-Warteschlange. Wenn Sie diese Weg gehen wollen, würde ich zooHud und zooTriggers Blick in (Teil von der zooToolbox)

vorschlagen Wenn Sie aktuelle GUI-Steuerung mit dem Ansichtsfenster parented fehlen, mel nur bietet hudslider, hudbutton und headsUpMessage .

Sie können auch PyQt und Eltern in Ihrem eigenen Widgets/Layout verwenden oder , was Sie so etwas wie dies mit wollen:

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

Sie können alles, was ein voll qt-Widget tun mit dem tun kann, so ist es extrem flexibel. aber es würde erfordern PyQt installiert, die kann eine Barriere abhängig von Ihrer Werkzeugverteilung sein.

Ich habe eine Mischung aus dieser Antwort und Ihr Code:

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

Einer der Frage habe ich es, dass der Hintergrund des Widgets glitched ist: Screenshot

Wenn jemand weiß, warum und Wie es zu beheben, werde ich meine Antwort gerne bearbeiten. Andernfalls, wenn Sie dieses Skript aus dem Skript-Editor von Maya ausführen, folgt das Widget dem Fenster, wenn es in der Größe geändert wird.

0

Ich habe ein solches Problem behoben, aber nicht mit Python/PyQt.

Das Problem selbst ist, dass Ihr Qt Widget da ist. Ich habe keinen Weg gefunden, es nicht malen seinen Hintergrund zu machen.

Meine Lösung war anders: Ich habe von einem Qt-Layout abgeleitet, alle meine Widgets in dieses Layout geschoben und MQtUtil verwendet, um das QWidget des ModelEditor von ModelPanel dazu zu bringen, das "echte Qt-Layout" anzuhängen.

Schwere Einschränkung, die Python möglicherweise nicht geeignet macht: Maya erwartet nicht, dass "non-Maya" -Layouts an "echte-Maya" -Widgets wie ModelEditors gebunden sind. Also musst du QEvents anhören und herausfinden, wann du dein Layout zerstören musst, damit Maya beim Versuch nicht abstürzt.

0

Satz autofillbackground Wahre Ihrer Hintergrundmalerei Ausgabe