3DS Max 2018 Pyside2 - 文本输入不工作

3DS Max 2018 Pyside2 - Text input not working

我正在为 3DS Max 2018 在 python 中编写一个 UI,但我无法让任何文本输入正常工作,尽管到目前为止我尝试的其他一切都工作正常。由于某种原因,它似乎无法读取击键。它们由 Max 注册,它会做一些适当的事情,比如当我按下 'm' 而不是键入 'm' 时启动 material 编辑器。我尝试打印出按键,但它看起来像控制、alt 和 shift 工作。

我什至尝试了 运行 Max 附带的示例脚本并得到了同样的错误,所以我意识到这可能是某种错误但是我不相信 Autodesk 现在会修复它所以我我正在寻找解决方法...

下面是一个测试示例:

from PySide2 import QtWidgets, QtCore, QtGui
import MaxPlus
import os

class SampleUI(QtWidgets.QDialog):
    def __init__(self, parent=MaxPlus.GetQMaxMainWindow()):
        super(SampleUI, self).__init__(parent)
        self.initUI()

    def initUI(self):
        self.testBtn = QtWidgets.QPushButton("Test")
        mainLayout = QtWidgets.QHBoxLayout()
        testBox = QtWidgets.QLineEdit("Test!")
        mainLayout.addWidget(testBox)
        self.setLayout(mainLayout)

if __name__ == "__main__":
    try:
        ui.close()
    except:
        pass

    ui = SampleUI()
    ui.show()

叹息终于找到了:https://help.autodesk.com/view/3DSMAX/2018/ENU/?guid=__developer_troubleshooting_3ds_max_python_a_html

"In order to capture keyboard input for your Qt windows, you must disable the 3ds Max keyboard accelerators by calling the following when your UI control gets focus:"

参考命令为:MaxPlus.CUI.DisableAccelerators()

并且不要忘记在脚本失去焦点时撤消它:MaxPlus.CUI.EnableAccelerators()

这是我在 Autodesks 论坛页面上找到的一个简单 ui:

http://help.autodesk.com/view/3DSMAX/2018/ENU/?guid=__developer_what_s_new_in_3ds_max_python_api_what_s_new_in_the_3ds_max_2018_p_html

max 文档中有 quite 很多歧义uity,一直都是,但希望对您有所帮助。我在不同的脚本中对此进行了一些编辑,我将 self 添加到控件中,以便能够访问控件并在不同的函数中设置连接,并且效果很好。

虽然这很乏味,但我仍然觉得 python 实施笨拙且繁琐。我仍然更喜欢使用 Maya Python,它一直很可靠,但我现在必须使用 MaxPlus。

from PySide2 import QtWidgets, QtCore, QtGui
import MaxPlus
import os

class SuperDuperText(QtWidgets.QLineEdit):
    def focusInEvent(self, event):
        MaxPlus.CUI.DisableAccelerators()

    def focusOutEvent(self, event):
        MaxPlus.CUI.EnableAccelerators()


class SuperDuperUI(QtWidgets.QDialog):

 def __init__(self, parent=MaxPlus.GetQMaxMainWindow()):
     super(SuperDuperUI, self).__init__(parent)
     self.setWindowTitle("Sample UI")
     self.initUI()


 def initUI(self):
     mainLayout = QtWidgets.QVBoxLayout()

     maxScriptsDir = MaxPlus.PathManager.GetScriptsDir()
     testLabel = QtWidgets.QLabel("Your scripts dir is: " + maxScriptsDir)
     mainLayout.addWidget(testLabel)

     testBtn = QtWidgets.QPushButton("This does nothing.")
     mainLayout.addWidget(testBtn)

     testEdit = SuperDuperText()
     testEdit.setPlaceholderText("You can type in here if you like...")
     mainLayout.addWidget(testEdit)

     self.setLayout(mainLayout)


if __name__ == "__main__":

 try:
    ui.close()
 except:
    pass

 ui = SuperDuperUI()
 ui.show()