2015-04-21 20 views
5

Tôi đang viết một trình đơn công cụ đơn giản cho Maya và tôi muốn gắn nó vào biên giới của bảng điều khiển mô hình (phối cảnh).Sự kiện thay đổi kích thước bảng điều khiển 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() 

Tiện ích chính được định vị chính xác nơi tôi muốn khi được tạo (nằm ngang ở phía bên trái của bảng điều khiển mô hình, theo chiều dọc - ở giữa bảng điều khiển mô hình).

Tôi cần đặt lại vị trí cho phù hợp khi bảng điều khiển được thay đổi kích thước, nhưng bảng điều khiển mô hình không phát ra tín hiệu resized(). Tôi đánh giá cao bất kỳ lời khuyên nào.

+0

Bất kỳ cách nào để nhận tín hiệu 'đã thay đổi kích thước' từ cửa sổ chính thay thế? – mhlester

+0

@mhlester theo như tôi biết, cửa sổ chính của Maya hoặc bất kỳ tiện ích Maya gốc nào khác không phát ra bất kỳ sự kiện nào khi được thay đổi kích thước. – Kupnu4

Trả lời

1

Tôi đã thử nhiều thứ để làm việc này ngày hôm qua. Tôi đã làm một số nghiên cứu thêm vào một số ngày hôm nay và đến chủ đề này: cgsociety: Creating a floating button inside the viewport

Trong trường hợp liên kết bị hỏng, đây là một trong những câu trả lời:

Bạn có thể sử dụng hình học nhưng có một số vấn đề với kích hoạt lệnh dựa về lựa chọn và hàng đợi hoàn tác. Nếu bạn muốn đi mà tuyến đường, tôi sẽ đề nghị xem xét zooHud và zooTriggers (Một phần của các zooToolbox)

Nếu bạn đang muốn kiểm soát giao diện thực tế có cấp độ gốc vào khung nhìn, mel chỉ cung cấp hudslider, hudbutton, và headsUpMessage .

Bạn cũng có thể sử dụng PyQt và phụ huynh ở riêng tùy chỉnh widget/layouts hoặc của bạn bất cứ điều gì bạn muốn sử dụng một cái gì đó như thế này:

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

Bạn có thể làm bất cứ điều gì một widget đầy đủ qt có thể làm với điều đó, vì vậy nó cực kỳ linh hoạt. nhưng nó sẽ yêu cầu phải cài đặt PyQt, trong đó có thể là một rào cản tùy thuộc vào phân phối công cụ của bạn.

tôi đã làm một kết hợp của câu trả lời này và mã của bạn:

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

Một trong những vấn đề này tôi có nó mà nền của các phụ tùng được glitched: Screenshot

Nếu có ai biết tại sao và làm thế nào để sửa chữa nó, tôi sẽ chỉnh sửa câu trả lời của tôi với niềm vui. Khác, khi chạy tập lệnh này từ trình chỉnh sửa tập lệnh của Maya, tiện ích con sẽ theo sau bảng điều khiển khi được thay đổi kích thước.

0

Tôi đã khắc phục vấn đề như vậy, nhưng không sử dụng Python/PyQt.

Vấn đề chính là, tiện ích con Qt của bạn ở đó. Tôi đã không tìm thấy cách để làm cho nó không sơn nền của nó.

Giải pháp của tôi khác: Tôi bắt nguồn từ Bố cục Qt, đẩy tất cả tiện ích của tôi vào bố cục đó và sử dụng MQtUtil để lấy QWidget của modelEdan modelPanel đó để đính kèm "bố cục Qt thực" vào đó.

Báo cáo trước có thể làm cho Python không phù hợp: Maya không mong đợi Layouts "không phải Maya" bị ràng buộc với các Widget "thực Maya" như modelEditors. Vì vậy, bạn cần phải lắng nghe QEvents và tìm ra khi nào để phá hủy bố trí của bạn, vì vậy Maya không sụp đổ cố gắng.

0

đặt tính năng tự động điền đúng Để khắc phục sự cố sơn nền của bạn

Các vấn đề liên quan