Maya PySide2 UI 获取 QLineEdit 值

Posted

技术标签:

【中文标题】Maya PySide2 UI 获取 QLineEdit 值【英文标题】:Maya PySide2 UI Get QLineEdit value 【发布时间】:2017-09-28 14:15:38 【问题描述】:

我开始使用 QtCreator 为 Maya 2017 的一个小工具创建 UI。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()

同样的事情,UI 出现了,但是点击 display_button 并没有发生任何事情

【问题讨论】:

请发布一个最小的示例代码.. 可能你需要使用 self.attr_name.text() 它究竟是如何不返回任何内容的?是否引发异常?它返回None 还是空字符串("")?您无法访问 QLineEdit 小部件本身吗? 抱歉,我更新了问题帖,如果还不清楚,请告诉我 self.attr_name_textfield.text()更改为self.ui.attr_name_textfield.text() 第二种情况,displayCommand甚至没有被执行,当我点击按钮时什么也没有发生,你有什么想法绑定它吗?我尝试使用 connectInterface 方法,但后来出现:# Error: AttributeError: file line 17: 'module' object has no attribute 'QtObject' # 【参考方案1】:

您第二次尝试该类似乎不错,但您无法执行displayCommand 是完全正常的,您的按钮未连接到您的方法。

只需删除您的 connectInterface 方法,然后在 ui_file.close() 之后复制以下内容: self.ui.display_button.clicked.connect(self.displayCommand)

它应该工作得更好:)(你也必须使用 eyllanesc 解决方案来访问小部件值)

【讨论】:

以上是关于Maya PySide2 UI 获取 QLineEdit 值的主要内容,如果未能解决你的问题,请参考以下文章

Maya Pyside2 UI,无法让 QPushButton 与同一类中的函数连接

使用 PySide2 开发 Maya 插件系列一:QT Designer 设计GUI, pyside-uic 把 .ui 文件转为 .py 文件

使用 PySide2 开发 Maya 插件系列二:继承 uic 转换出来的 py 文件中的类 Ui_Form

使用 PySide2 开发 Maya 插件系列三:qt语言国际化(internationalization)

maya 独立与 pyside2

Maya (PySide2) - 重新打开窗口而不是新窗口