【问题标题】:pyqt+maya = fatal error when click to context menupyqt+maya = 单击上下文菜单时出现致命错误
【发布时间】:2020-02-22 20:41:02
【问题描述】:

我在 Autodesk Maya 中使用 pyqt。一切正常,但是当我尝试将上下文菜单连接到我的元素时 - maya 出现致命错误并关闭。

import maya.OpenMayaUI as mui
import maya.api.OpenMaya as om

import sip
from PyQt4 import QtGui, QtCore, uic

#----------------------------------------------------------------------
def getMayaWindow():
    ptr = mui.MQtUtil.mainWindow()
    return sip.wrapinstance(long(ptr), QtCore.QObject)

#----------------------------------------------------------------------
form_class, base_class = uic.loadUiType('X:/tools/Maya/windows/2014/python/UI/perforceBrowserWnd.ui')

#----------------------------------------------------------------------
# main window class
#----------------------------------------------------------------------
class PerforceWindow(base_class, form_class):
    def __init__(self, parent=getMayaWindow()):
        super(base_class, self).__init__(parent)
        self.setupUi(self)

        # Popup Menu is not visible, but we add actions from above
        self.popMenu = QtGui.QMenu( self )
        self.popMenu.addAction("revert", self.on_action_revert)
        self.popMenu.addAction("submit", self.on_action_submit)

        self.filesListWgt.customContextMenuRequested.connect( self.filesListWgtMenuRequested )

    #------------------------------------------------------------------
    def filesListWgtMenuRequested(self, pos):
        self.popMenu.exec_( self.filesListWgt.mapToGlobal(pos) )

    def on_action_revert(self):
        print('on_action_revert')

    def on_action_submit(self):
        print('on_action_submit')


#----------------------------------------------------------------------
# window
#----------------------------------------------------------------------
def perforceBrowser2():    
    perforceBrowserWnd = PerforceWindow()
    perforceBrowserWnd.show()

perforceBrowser2()

在 qtdesigner 中创建的对话框。我在 QListWidtet 的设计器中设置了属性 contentMenuPolicy。当我右键单击 QListWidtet 或任何元素时 - 我看到一个上下文菜单。但是如果我单击菜单或将其关闭 - 玛雅会出现致命错误

我看到了日志文本 - 调用了函数 on_action_revert。但在那之后 - 玛雅坠毁了。

我做错了什么?

更新:

我尝试简单的测试。替换菜单以简单调用函数:

替换连接到:

    self.filesListWgt.customContextMenuRequested.connect( self.on_action_revert )

def on_action_revert(self):
    print('on_action_revert')

这也是玛雅崩溃

【问题讨论】:

  • 您在哪个版本的 Maya 上进行测试?
  • 您选择使用 pyqt 而非 Maya 2014 附带的 pyside 是否有特殊原因?
  • 机会 pyqt 以上。包括我可以在 qtdesigner 中创建一个窗口的事实。除此之外,我总是使用这些在pyqt上制作的窗口,而不仅仅是在maya中。不是选择pyside或pyqt的问题。但是如何使它正常工作(
  • 我会调查这个问题,但只是附带说明:我们可以使用 PySide 作为 PyQt 的完全替代品,建议在 Maya 2014+ 中这样做。您也可以继续使用为此设计的 Qt。 Maya 2014+ 自带 PySide;我们需要确保您的 PyQt for Maya 没有构建问题。如果您在 PySide 中执行此操作,则无需执行此操作。看看这篇文章:jason-parks.com/artoftech/?p=579
  • 看看这个。您可以使用它来编写在 PyQt 和 PySide 中都兼容的代码。 github.com/rgalanakis/practicalmayapython/blob/master/src/…

标签: pyqt contextmenu maya


【解决方案1】:

我在 Maya 2013 的 PyQt 以及 Maya 2014 的 PySide(使用 QtShim)上测试了您的代码以及您的 UI 文件,您的代码运行很好请检查您为 Maya 2014 构建的 PyQt。

我建议尝试在 Maya 2014 上使用 PySide 运行您的代码。为此,您不需要更改任何代码库。您只需要修改一些导入。值得一试:看看这个。您可以使用它来编写在 PyQt 和 PySide 中兼容的代码。 https://github.com/rgalanakis/practicalmayapython/blob/master/src/chapter5/qtshim.py

要在 PySide 环境中加载您的 ui 文件,请查看这篇文章:http://www.jason-parks.com/artoftech/?p=579

PyQt 和 PySide 都是 Qt 框架的 python 包装器。除了很少的差异之外,它们是相同的。因此,无论您使用什么运行它,您的代码库都不需要更改。

附:但无论出于何种原因,您对 2014 年使用 PyQt 如此特别,请使用这些指南来构建它:http://download.autodesk.com/us/support/files/maya_documentation/pyqtmaya2014.pdf 和这个:http://around-the-corner.typepad.com/adn/2013/04/building-sip-and-pyqt-for-maya-2014.html

【讨论】:

  • 我尝试编译新版本的 PyQt + Sip。而且做不到。我不知道出了什么问题,但它出现了很多错误并且没有工作......也许你可以存档并发送你的工具包 pyqt +sip for maya 2014?我有 Windows 7 x64
  • 在工作室我们有 Maya 2013、2014 和 2015。我们只有为 Maya 2013 构建的 PyQt,因为我们为 2014 和 2015 构建 PyQt 没有意义,因为它们有 PySide。我们使用我的回答中概述的概念来使我们的 PyQt 代码在所有版本的 Maya 中运行。
  • 引用为 Maya 2014 构建 PyQt 的官方指南:“但是,请注意,对于 Maya 2014,不再需要构建 PySide,因为它在 Maya 中默认提供,您也不必重建 Qt 本身作为构建 PyAt 的主要 Qt 工具现在包含在 Maya 发行版中(即 qmake、moc、)"
  • 但无论出于何种原因,您在 2014 年都特别喜欢使用 PyQt(老实说,我不明白为什么!)请使用这些指南来构建它:google.ca/… 和这个:around-the-corner.typepad.com/adn/2013/04/… 祝一切顺利给你。
  • 我重新安装了所有 pyqt 和 sip。一切都奏效了。谢谢! )
【解决方案2】:

Maya 特定的 PyQt 构建在这个由 Marcus Ottosson 维护的 Github 存储库中维护。您可以自己获取特定构建并将其添加到 PYTHONPATH。我在 Maya 2015 中遇到了同样的问题,这有帮助。

https://github.com/pyqt

【讨论】:

  • 抱歉,问题在几年前就解决了)现在我使用 Maya 2017+ pyside)
  • @maxku:我添加了答案,供许多仍在使用旧版 Maya 的人参考。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-21
  • 1970-01-01
  • 1970-01-01
  • 2012-08-08
  • 2020-05-26
  • 2011-08-01
相关资源
最近更新 更多