Пользовательский интерфейс Maya PySide2 Получить значение QLineEdit

Я начинаю использовать QtCreator для создания пользовательского интерфейса для небольшого инструмента для Maya 2017. QtCreator дал мне этот файл .ui:

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>DockWidget</class>
 <widget class="QDockWidget" name="DockWidget">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>550</width>
    <height>251</height>
   </rect>
  </property>
  <property name="floating">
   <bool>true</bool>
  </property>
  <property name="windowTitle">
   <string>Attr Editor</string>
  </property>
  <widget class="QWidget" name="dockWidgetContents">
   <widget class="QLineEdit" name="attr_value_textfield">
    <property name="geometry">
     <rect>
      <x>130</x>
      <y>128</y>
      <width>391</width>
      <height>20</height>
     </rect>
    </property>
    <property name="toolTip">
     <string>attr_value</string>
    </property>
   </widget>
   <widget class="QLabel" name="label">
    <property name="geometry">
     <rect>
      <x>227</x>
      <y>20</y>
      <width>97</width>
      <height>25</height>
     </rect>
    </property>
    <property name="font">
     <font>
      <family>Century Gothic</family>
      <pointsize>16</pointsize>
      <weight>75</weight>
      <bold>true</bold>
     </font>
    </property>
    <property name="text">
     <string>Attr Editor</string>
    </property>
   </widget>
   <widget class="QPushButton" name="pushButton_2">
    <property name="geometry">
     <rect>
      <x>240</x>
      <y>180</y>
      <width>75</width>
      <height>23</height>
     </rect>
    </property>
    <property name="text">
     <string>Submit</string>
    </property>
    <property name="+command" stdset="0">
     <string>submitCommand</string>
    </property>
   </widget>
   <widget class="QLabel" name="label_3">
    <property name="geometry">
     <rect>
      <x>20</x>
      <y>130</y>
      <width>80</width>
      <height>16</height>
     </rect>
    </property>
    <property name="font">
     <font>
      <family>Century Gothic</family>
     </font>
    </property>
    <property name="text">
     <string>Attribute Value</string>
    </property>
   </widget>
   <widget class="QLineEdit" name="attr_name_textfield">
    <property name="geometry">
     <rect>
      <x>130</x>
      <y>78</y>
      <width>391</width>
      <height>20</height>
     </rect>
    </property>
    <property name="toolTip">
     <string>attr_name</string>
    </property>
    <property name="whatsThis">
     <string/>
    </property>
   </widget>
   <widget class="QPushButton" name="pushButton_3">
    <property name="geometry">
     <rect>
      <x>440</x>
      <y>180</y>
      <width>75</width>
      <height>23</height>
     </rect>
    </property>
    <property name="text">
     <string>Cancel</string>
    </property>
    <property name="+command" stdset="0">
     <string>cancelCommand</string>
    </property>
   </widget>
   <widget class="QPushButton" name="display_button">
    <property name="geometry">
     <rect>
      <x>30</x>
      <y>180</y>
      <width>75</width>
      <height>23</height>
     </rect>
    </property>
    <property name="text">
     <string>Display</string>
    </property>
    <property name="+command" stdset="0">
     <string>displayCommand</string>
    </property>
   </widget>
   <widget class="QLabel" name="label_2">
    <property name="geometry">
     <rect>
      <x>20</x>
      <y>80</y>
      <width>82</width>
      <height>16</height>
     </rect>
    </property>
    <property name="font">
     <font>
      <family>Century Gothic</family>
     </font>
    </property>
    <property name="text">
     <string>Attribute Name</string>
    </property>
   </widget>
  </widget>
 </widget>
 <resources/>
 <connections/>
</ui>

И у меня есть этот код, который отображает мой пользовательский интерфейс:

import maya.cmds as cmds 
from PySide2.QtWidgets import *
from PySide2.QtCore import *

if cmds.window(main_window, ex = True):
    cmds.deleteUI(main_window)

main_window = cmds.loadUI(uiFile = "C:/Users/thornydre/Desktop/attreditorui.ui")
cmds.showWindow(main_window)

def displayCommand(e):
    print(attr_name_textfield.text())
    print(attr_value_textfield.text())

def submitCommand(e):
    attr_name = attr_name_textfield.text()
    attr_value = attr_value_textfield.text()

    is_string = False

    try:
        new_attr_value = float(attr_value)
        if float(attr_value) % 1 == 0:
            new_attr_value = int(attr_value)
    except:
        is_string = True
        new_attr_value = attr_value

    print(new_attr_value)

    for name in cmds.ls(sl = True):
        if is_string:
            cmds.setAttr(name + "." + attr_name, new_attr_value, type = "string")
        else:
            cmds.setAttr(name + "." + attr_name, new_attr_value)

def cancelCommand(e):
    cmds.deleteUI(main_window, window = True)

И если я нажму на кнопку display_button, у меня будет ошибка:

# Result: dockWidgetContents|display_button # 
# Error: AttributeError: file <maya console> line 12: 'bool' object has no attribute 'attr_name_textfield' # 

Я попытался сделать это с помощью подкласса QtWidgets.QWidget, который я нашел где-то в Интернете, но я действительно не нашел никакого руководства о том, как его правильно построить:

from PySide2 import QtCore, QtGui, QtWidgets, QtUiTools

class Interface(QtWidgets.QWidget):
    def __init__(self, parent = None):
        super(Interface, self).__init__(parent)
        ui_filename = "C:/Users/thornydre/Desktop/attreditorui.ui"
        ui_file = QtCore.QFile(ui_filename)
        ui_file.open(QtCore.QFile.ReadOnly)
        self.ui = QtUiTools.QUiLoader().load(ui_file, parentWidget=self)
        ui_file.close()

    def connectInterface(self):
        QtCore.QtObject.connect(self.displayCommand, QtCore.SIGNAL("clicked()"), self.displayCommandWin)

    def displayCommand(self):
        print(self.attr_name_textfield.text())
        print(self.attr_value_textfield.text())

def main():
    global ui
    ui = Interface()

if __name__ == "__main__":
    main()

То же самое здесь, пользовательский интерфейс появляется, но на самом деле ничего не происходит при нажатии на кнопку display_button


person Thornydre    schedule 28.09.2017    source источник
comment
пожалуйста, опубликуйте минимальный пример кода.. возможно, вам нужно использовать self.attr_name.text()   -  person Achayan    schedule 28.09.2017
comment
Как именно он ничего не возвращает? Возникает ли исключение? Возвращает ли он None или пустую строку ("")? Вы не можете получить доступ к самому виджету QLineEdit?   -  person All Workers Are Essential    schedule 28.09.2017
comment
Извините, я обновил сообщение с вопросами, поэтому скажите мне, если это все еще неясно   -  person Thornydre    schedule 29.09.2017
comment
Изменить self.attr_name_textfield.text() на self.ui.attr_name_textfield.text()   -  person eyllanesc    schedule 29.09.2017
comment
Во втором случае displayCommand даже не выполняется, и ничего не происходит, когда я нажимаю кнопку, есть ли у вас какие-либо идеи для ее привязки? Я попытался использовать метод connectInterface, но затем у меня есть: # Ошибка: AttributeError: файл ‹maya console› строка 17: объект 'module' не имеет атрибута 'QtObject' #   -  person Thornydre    schedule 29.09.2017
comment
Есть ли у вас какие-либо идеи ?   -  person Thornydre    schedule 19.10.2017


Ответы (1)


Ваша вторая попытка с классом кажется хорошей, но совершенно нормально, что вы не можете выполнить displayCommand, ваша кнопка не подключена к вашему методу.

Просто удалите свой метод connectInterface и сразу после ui_file.close() скопируйте это: self.ui.display_button.clicked.connect(self.displayCommand)

Это должно работать лучше :) (и вам также нужно использовать решение eyllanesc для доступа к значениям виджетов)

person Mathieu    schedule 09.11.2017