2015-09-10 1 views
0

Я пытаюсь найти способ как-то «получить» компонент GUI, вызывающий функцию. Таким образом, я могу еще больше объединить свой код в части многократного использования для компонентов, которые выполняют аналогичные задачи. Мне нужен способ сделать это в командах GUI от Maya, а также в Qt. Я предполагаю, что я ищу общий трюк python, например, «init», «файл», «main» и т. Д. Если для этого нет общего способа python, любая майя/Qt специальные трюки также приветствуются.Как получить компонент Maya/Qt GUI, который вызывает функцию?

Вот некоторый произвольный псевдо код, чтобы лучше объяснить, что я ищу:

field1 = floatSlider(changeCommand=myFunction) 
field2 = colorSlider(changeCommand=myFunction) 

def myFunction(*args): 
    get the component that called this function 

    if the component is a floatSlider 
     get component's value 
     do the rest of the stuff 

    elif the component is a colorSlider 
     get component's color 
     do the rest of the stuff 
+0

В Qt есть сигналы и слоты, и есть метод QObject.sender(), который возвращает вызывающий элемент GUI. – Gombat

ответ

1

расширяющегося от комментариев Gombat, вот пример того, как получить обобщенную функцию для работы с ползунком и со счётчиком контроль:

from PySide import QtGui, QtCore 

class Window(QtGui.QWidget): 
    def __init__(self, parent = None): 
     super(Window, self).__init__(parent) 

     # Create a slider 
     self.floatSlider = QtGui.QSlider() 
     self.floatSlider.setObjectName('floatSlider') 
     self.floatSlider.valueChanged.connect(self.myFunction) 

     # Create a spinbox 
     self.colorSpinBox = QtGui.QSpinBox() 
     self.colorSpinBox.setObjectName('colorSlider') 
     self.colorSpinBox.valueChanged.connect(self.myFunction) 

     # Create widget's layout 
     mainLayout = QtGui.QHBoxLayout() 
     mainLayout.addWidget(self.floatSlider) 
     mainLayout.addWidget(self.colorSpinBox) 
     self.setLayout(mainLayout) 

     # Resize widget and show it 
     self.resize(300, 300) 
     self.show() 

    def myFunction(self): 
     # Getting current control calling this function with self.sender() 
     # Print out the control's internal name, its type, and its value 
     print "{0}: type {1}, value {2}".format(self.sender().objectName(), type(self.sender()), self.sender().value()) 

win = Window() 

Я не знаю, что контролировать вы хотите colorSlider (я не думаю, что PySide имеет тот же движок, что и один в Maya, вы, возможно, придется настроить его или использовать QColorDialog). Но это должно дать вам общее представление о том, как это сделать.

Смежные вопросы